我构建了一个神经网络,用于对 3D 图像进行逐像素分类。
分类任务非常简单,不需要卷积网络,而是我计算了一些特征(Gaussian、LoG、Sobel 等)并将它们与原始值一起输入到经典 MLP 中。由于此功能的计算速度非常慢并且没有利用我的 GPU,我认为 Tensorflow 实现可能会有所帮助:
首先,我读取一个二进制文件并创建一个具有 3D 阵列和 1 个 channel 的批处理:
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)]]
没有注册 OpKernel 来支持具有这些属性的 Op 'Conv3D'
意味着您传递给函数调用的属性与该函数的任何现有实现都不匹配。
节点: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,而是将输入类型更改为已经实现的类型。将 Stack
和 TF_kernel
的类型更改为 float32
或 float64
(例如,定义 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 的,我想尝试看看情况是否有所改善是最好的选择(如果您可以更新您的问题让我们知道它是否确实加快了速度,那就太好了)。 我还建议检查您是否正在使用 GPU Tensorflow 版本,如果没有,请切换到那个版本(它更有可能加快您的计算速度)。
关于python - 使用 Tensorflow 进行预处理的 3D 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46076970/