我为3D图像的像素级分类构建了一个神经网络。
这个分类任务非常简单,并不需要使用卷积网络。相反,我计算了许多特征(高斯、LoG、Sobel等),然后将这些特征与原始值一起馈送到经典的MLP中。由于计算这些特征非常缓慢,并且无法利用我的GPU,所以我认为可以使用Tensorflow实现来提高效率:
首先,我读取二进制文件并创建一个具有3D数组和1个通道的批次。
这个分类任务非常简单,并不需要使用卷积网络。相反,我计算了许多特征(高斯、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]
然后我使用自定义函数创建一个三维核,并定义三维卷积:
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实现)可以提高执行速度?
kernel=np.ones((11,11,11,1,1),dtype='float32')
。 - GPhilo