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

标签 python multidimensional-array tensorflow convolution

我构建了一个神经网络,用于对 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,而是将输入类型更改为已经实现的类型。将 StackTF_kernel 的类型更改为 float32float64(例如,定义 kernelkernel=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/

相关文章:

arrays - 在 Free Pascal 中处理对象数组

TensorFlow GPU,tf.one_hot() 上的 CUDA_ERROR_LAUNCH_FAILED

python - OpenCV-CUDA Win10。导入时未找到 Python 模块

python - 如何编辑嵌入消息 - discord.py

python - 我可以向量化这个二维数组索引,其中第二维取决于第一维的值吗?

python - 值错误: invalid literal for int() with base 10 on Alexnet

python - 如何在 Tensorflow 中使用 label_image.py 一次测试多个图像

python - Fbprophet 快速入门示例 - KeyError : 'ds'

python - 在 sqlalchemy 查询中使用 jsonb_array_elements

javascript - 用于选择国家的下拉菜单,然后是州,然后是地区