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

3D convolution for preprocessing with Tensorflow

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

分类任务非常简单,不需要卷积网络,而是我计算了一些特征(Gaussian、LoG、Sobel 等...)并将这些与原始值一起输入到经典网络中多层板。由于此功能的计算速度非常慢并且没有利用我的 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卷积?

第二个问题:我假设在tensorflow(目前使用scikit-image 实现)中实现它对执行速度有好处,我的假设是否正确?

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

解密错误信息:

你的错误:

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 个可用的实现。一个在你的 CPU 上运行并输入一个 float32 张量 (DT_FLOAT),而另一个也在你的 CPU 上运行 运行 作为输入 float64 张量 (DT_DOUBLE).

注意: Registered devices: [CPU], 似乎指出你的 Tensorflow 没有看到你的 GPU (你安装了吗?仅 CPU 版本的 Tensorflow?)。

您问题的答案:

What does this error mean and how do I implement a 3D convolution?

我认为错误在上一节中已经解释得足够多了。您不想自己实现 Conv3D,而是将输入类型更改为已经实现的类型。将 StackTF_kernel 的类型更改为 float32float64(例如,将 kernel 定义为 kernel=np.ones((11,11,11,1,1),dtype='float32'))。

Am I right in my assumption that implementing this in tensorflow (currently implemented with scikit-image) will be of advantage for the execution speed?

很难说。由于这两个实现都是 CPU-only,我想尝试看看事情是否有所改善是最好的选择(如果你能更新你的问题让我们知道它是否确实加速了那就太好了)。 我还建议检查您是否正在使用 GPU Tensorflow 版本,如果没有,请切换到那个版本(它更有可能加快您的计算速度)。