我建立了一个神经网络,用于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实现)对执行速度有利?
答案 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_kernel
或float32
(例如,使用float64
定义kernel
)。
我是否正确地认为在tensorflow中实现这一点(目前用scikit-image实现)对执行速度有利?
很难说。由于这两种实现都只是CPU,我想尝试并看看事情是否有所改进是最好的选择(如果你可以更新你的问题会让我们知道它是否真的加速了会很棒)。 我还建议检查您是否正在使用GPU Tensorflow构建,如果没有,请切换到那个(有更高的机会加速计算)。