使用Tensorflow进行预处理的3D卷积

时间:2017-09-06 13:46:39

标签: python multidimensional-array tensorflow convolution

我建立了一个神经网络,用于3D图像的像素分类。

分类任务非常简单,不需要卷积网络,而是计算了许多特征(Gaussian,LoG,Sobel等等),并将这些特征与原始值一起提供给经典的MLP。由于这些功能的计算非常慢并且没有利用我的GPU,我认为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实现)对执行速度有利?

1 个答案:

答案 0 :(得分:2)

我会在评论中以更有秩序的方式整理解决方案,万一其他人偶然发现这个问题。

解密错误消息:

您的错误:

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节点引发错误,输入张量的类型为{ {1}}。

int32

告诉您,对于Registered kernels: device='CPU'; T in [DT_FLOAT] device='CPU'; T in [DT_DOUBLE] 操作,您的计算机上有2个可用的实现。一个在你的CPU上运行,输入为Conv3D张量(float32),而另一个也在你的CPU上运行,作为输入DT_FLOAT张量(float64)。

注意: DT_DOUBLE似乎指出您的Tensorflow 没有看到您的GPU (您是否安装了仅限CPU的Tensorflow版本? )。

您的问题的答案:

  

这个错误是什么意思,我该如何实现3D卷积?

我认为上一节已经解释了错误。您不想自己实现Conv3D,而是将输入类型更改为已有实现的内容。将Registered devices: [CPU],Stack的类型更改为TF_kernelfloat32(例如,使用float64定义kernel)。

  

我是否正确地认为在tensorflow中实现这一点(目前用scikit-image实现)对执行速度有利?

很难说。由于这两种实现都只是CPU,我想尝试并看看事情是否有所改进是最好的选择(如果你可以更新你的问题会让我们知道它是否真的加速了会很棒)。 我还建议检查您是否正在使用GPU Tensorflow构建,如果没有,请切换到那个(有更高的机会加速计算)。