Python 基于Tensorflow的三维卷积预处理

Python 基于Tensorflow的三维卷积预处理,python,multidimensional-array,tensorflow,convolution,Python,Multidimensional Array,Tensorflow,Convolution,我建立了一个用于三维图像像素分类的神经网络 分类任务非常简单,不需要卷积网络,而是计算一些特征(高斯、对数、Sobel等),并将这些特征与原始值一起输入经典MLP。由于此功能的计算速度非常慢,并且没有利用我的GPU,因此我认为Tensorflow实现可能会有所帮助: 首先,我读取一个二进制文件,创建一个带有3D阵列和1个通道的批次: data_dir="/Users/Me/Documents/Data/" filenames = [os.path.join(data_dir,'File_%05d

我建立了一个用于三维图像像素分类的神经网络

分类任务非常简单,不需要卷积网络,而是计算一些特征(高斯、对数、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卷积


第二个问题:在tensorflow中实现这一点(目前使用scikit映像实现)将有利于提高执行速度,我的假设是否正确

我正在以一种更有序的方式将解决方案放在评论中,以防其他人在这个问题上绊倒

解读错误消息: 您的错误:

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)]]
没有注册操作内核来支持带有这些属性的Op“Conv3D”
意味着传递给函数调用的属性与该函数的任何现有实现都不匹配

Node:Conv3D\u 1=Conv3D[
T=DT\u INT32
,padding=“SAME”,strips=[1,1,1,1]](重塑,LoG\u filter/read)]
告诉您图形中引发错误的
Conv3D
节点,输入张量的类型为
INT32

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

注意:
注册设备:[CPU],
似乎指出了一个事实,即您的Tensorflow没有看到您的GPU(您是否安装了Tensorflow的仅CPU版本?)

你的问题的答案是: 这个错误意味着什么?如何实现三维卷积

我认为在上一节中已经对错误进行了充分的解释。您不希望自己实现Conv3D,而是将输入类型更改为已经有实现的类型。将
Stack
TF_kernel
的类型更改为
float32
float64
(例如,使用
kernel=np.one((11,11,11,1,1),dtype='float32')
定义
kernel

在tensorflow中实现此功能(目前使用scikit映像实现)将有利于提高执行速度,我的假设是否正确

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

对于第一个问题:尝试定义
kernel=np.ones((11,11,11,1,1),dtype='float32')
instead该错误意味着没有针对特定输入类型组合执行Conv3D操作。您的内核类型为int,但内核可用于浮点和双精度运算(至少根据错误消息),根据速度问题,这些操作似乎仅在CPU上实现(同样,读取int错误消息)。试试看速度是否有所提高。附带问题:您是否使用Tensorflow的GPU构建?因为错误代码中的
注册设备:[CPU]
似乎意味着Tensorflow看不到您的GPU…好的,在内核和堆栈中切换到“float32”都可以工作,谢谢,但是卷积现在比scikit映像实现花费的时间要长。我正在我的笔记本电脑上写代码,但我会在一台装有GPU的电脑上进行实际培训,不用担心;)谢谢你的解释,有时候这种错误对我来说是相当神秘的!我目前正在没有GPU的笔记本电脑上编写和测试这些程序(因此错误消息中没有GPU)。一旦我在我们的CUDA计算机上测试它,我会用这个实现的结果更新我的问题。不客气!我认为与Tensorflow抗争的一个重要部分是找出所有这些代码的含义(幸运的是,这是一个相当详细的框架),因此我希望这将有助于解决未来的其他错误。期待速度的结果!;)