3D-свертка для предварительной обработки с помощью Tensorflow

Я построил нейронную сеть для попиксельной классификации 3D-изображений.

Задача классификации очень проста и не требует сверточной сети, вместо этого я вычисляю ряд признаков (гауссовский, LoG, Sobel и т. д.) и передаю их вместе с исходным значением в классический MLP. Поскольку расчет этих функций очень медленный и не использует преимущества моего графического процессора, я подумал, что может помочь реализация Tensorflow:

Сначала я читаю бинарный файл и создаю один пакет с 3D-массивом и 1 каналом:

data_dir="/Users/Me/Documents/Data/"
filenames = [os.path.join(data_dir,'File_%05d.bin' % i ) for i in range(100)]
filename_queue = tf.train.string_input_producer(filenames)
Stack= BinChunkReader(filename_queue) #custom reader

sess = tf.Session()
print(sess.run(tf.shape(Stack))) #outputs [1 100 100 100 1]

Затем я создаю 3D-ядро, используя пользовательскую функцию, и определяю 3D-свертку:

kernel=np.ones((11,11,11,1,1),dtype='int32')
kernel[:,:,:,0,0]=Get3DKernel("LoG", Radius=6,Param=5) #custom function to produce a kernel

kernel_init=tf.constant(kernel)
TF_kernel=tf.get_variable('LoG_filter', initializer= kernel_init)
LoG=tf.nn.conv3d(Stack,TF_kernel,[1,1,1,1,1],"SAME")

но пытаюсь запустить это

sess = tf.Session()
sess.run(LoG)

выдает следующую ошибку:

InvalidArgumentError: No OpKernel was registered to support Op 'Conv3D' with these attrs.  Registered devices: [CPU], Registered kernels:
  device='CPU'; T in [DT_FLOAT]
  device='CPU'; T in [DT_DOUBLE]

     [[Node: Conv3D_1 = Conv3D[T=DT_INT32, padding="SAME", strides=[1, 1, 1, 1, 1]](Reshape, LoG_filter/read)]]

Первый вопрос: что означает эта ошибка и как реализовать 3D-свертку?

Второй вопрос: прав ли я в своем предположении, что реализация этого в тензорном потоке (в настоящее время реализованном с помощью scikit-image) будет иметь преимущество для скорости выполнения?


person McMa    schedule 06.09.2017    source источник
comment
Для вашего первого вопроса: попробуйте вместо этого определить kernel=np.ones((11,11,11,1,1),dtype='float32')   -  person GPhilo    schedule 06.09.2017
comment
Ошибка означает, что операция Conv3D не реализована для этой конкретной комбинации типов ввода. Ваше ядро ​​имеет тип int, но ядра доступны для чисел с плавающей запятой и двойных чисел (по крайней мере, согласно сообщению об ошибке)   -  person GPhilo    schedule 06.09.2017
comment
Что касается вопроса о скорости, кажется, что эти операции выполняются только на ЦП (опять же, чтение сообщения об ошибке). Попробуйте и посмотрите, улучшится ли скорость. Дополнительный вопрос: используете ли вы сборку Tensorflow для графического процессора? Поскольку Registered Devices :[CPU] в коде ошибки, по-видимому, означает, что Tensorflow не видит ваш GPU...   -  person GPhilo    schedule 06.09.2017
comment
Хорошо, переключение на «float32» как в ядре, так и в стеке работает, спасибо, и все же свертка теперь занимает намного больше времени, чем реализация образа scikit. Я пишу код на своем ноутбуке, но фактическое обучение проведу на компьютере с графическим процессором, не беспокойтесь;)   -  person McMa    schedule 06.09.2017


Ответы (1)


Я собираю решение в комментариях более упорядоченным образом на случай, если кто-то еще наткнется на этот вопрос.

Расшифровка сообщения об ошибке:

Ваша ошибка:

InvalidArgumentError: No OpKernel was registered to support Op 'Conv3D' with these attrs.  
Registered devices: [CPU], 
Registered kernels:
  device='CPU'; T in [DT_FLOAT]
  device='CPU'; T in [DT_DOUBLE]
[[Node: Conv3D_1 = Conv3D[T=DT_INT32, padding="SAME", strides=[1, 1, 1, 1, 1]](Reshape, LoG_filter/read)]]

No OpKernel was registered to support Op 'Conv3D' with these attrs означает, что атрибуты, которые вы передали вызову функции, не соответствуют ни одной существующей реализации этой функции.

Node: Conv3D_1 = Conv3D[T=DT_INT32, padding="SAME", strides=[1, 1, 1, 1, 1]](Reshape, LoG_filter/read)] говорит о том, что для узла Conv3D на вашем графике, который вызывает ошибку, входной тензор имеет тип int32.

Registered kernels:
  device='CPU'; T in [DT_FLOAT]
  device='CPU'; T in [DT_DOUBLE]

сообщает, что для операции Conv3D на вашем компьютере доступны 2 реализации. Один работает на вашем процессоре и имеет в качестве входных данных тензор float32 (DT_FLOAT), а другой также работает на вашем процессоре, принимая в качестве входных данных тензоры float64 (DT_DOUBLE).

Примечание. Registered devices: [CPU], указывает на тот факт, что ваш Tensorflow не видит ваш GPU (вы установили сборку Tensorflow только для процессора?).

Ответ на ваши вопросы:

Что означает эта ошибка и как реализовать 3D-свертку?

Я думаю, что ошибка была объяснена достаточно в предыдущем разделе. Вы не хотите реализовывать Conv3D самостоятельно, а скорее измените тип ввода на то, что уже имеет реализацию. измените тип Stack и TF_kernel на float32 или float64 (например, определите kernel с kernel=np.ones((11,11,11,1,1),dtype='float32')).

Прав ли я в своем предположении, что реализация этого в тензорном потоке (в настоящее время реализованном с помощью scikit-image) будет иметь преимущество для скорости выполнения?

Сложно сказать. Поскольку обе реализации предназначены только для ЦП, я думаю, что лучший вариант — попробовать и посмотреть, улучшится ли ситуация (было бы здорово, если бы вы могли затем обновить свой вопрос, сообщив нам, действительно ли он ускорился). Я также предлагаю проверить, используете ли вы сборку GPU Tensorflow, и, если нет, переключиться на нее (у нее гораздо больше шансов ускорить ваши вычисления).

person GPhilo    schedule 06.09.2017
comment
Спасибо за объяснение, иногда такие ошибки для меня довольно загадочны! В настоящее время я пишу и тестирую эти программы на своем ноутбуке без графического процессора (отсюда и его отсутствие в сообщении об ошибке). Я обновлю свой вопрос результатом этой реализации, как только протестирую ее на нашем компьютере с поддержкой CUDA. - person McMa; 06.09.2017
comment
Пожалуйста! Я думаю, что большая часть борьбы с Tensorflow заключается в том, чтобы выяснить, что означают все эти коды (к счастью, это довольно многословная структура), поэтому я надеюсь, что это поможет с другими ошибками в будущем. Жду результатов скорости! ;) - person GPhilo; 06.09.2017