【问题标题】:How to implement a simple CNN for 3D data using Keras Conv3D如何使用 Keras Conv3D 为 3D 数据实现简单的 CNN
【发布时间】:2018-05-27 16:33:48
【问题描述】:

我正在尝试实现一个具有医学成像功能的 3D 卷积神经网络,该网络由 10 个 64x64 形状的连续图像切片组成。它们是灰度图像。因此我的输入尺寸是 64 x 64 x 10 我的第一层是

model = Sequential()
model.add(Conv3D(32, kernel_size=(3,3,3), strides=(1, 1, 1), input_shape=(64, 64, 10)))
model.add(Activation('relu'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))

使用此代码我得到错误

Input 0 is incompatible with layer conv3d_1: expected ndim=5, found ndim=4

因此我将输入重新调整为

model = Sequential()
model.add(Conv3D(32, kernel_size=(3,3,3), strides=(1, 1, 1), input_shape=(64, 64, 10, 1)))
model.add(Activation('relu'))
model.add(MaxPooling3D(pool_size=(2, 2, 2)))

现在我得到了错误

ValueError: ('Input data in `NumpyArrayIterator` should have rank 4. You passed an array with shape', (128, 64, 64, 10, 1))

我试图在 Keras 代码中覆盖它,但这会导致更多错误,我很确定可以输入大量切片 - 我只是看不出问题出在哪里。

【问题讨论】:

  • 您能否编辑您的问题,显示您如何初始化 numpy 数组,以及您传递给模型编译和拟合函数的内容。
  • 您在哪里收到此错误?
  • 在我看来,您在某处以 128 的批大小对数据进行了批处理,我会说您的输入形状应该看起来像 (1, 64,64,10) 而不是 (64,64,10, 1),而不是一个,尝试批处理它,因为它看起来像是在你的代码中的某个地方,你批处理了一些数组。需要看更多才能弄清楚。

标签: image keras convolution


【解决方案1】:

这是我这几天头疼的问题。

发生的事情是 Keras 自动将图像中的通道数设置为深度,并使用它来设置最终的过滤器大小。您应该使用 Conv2D 代替,因为您有 3-dim 图像(您可以将其理解为 RGB 图像)。

正如我所说,Keras 自动将深度固定为通道数。因此,如果您使用 Conv2D 将过滤器尺寸固定为 (5x5),它实际上将是 (5x5xnºchannels)。

替换:

model.add(Conv3D(32, kernel_size=(3,3,3), strides=(1, 1, 1), input_shape=(64, 64, 10)))

收件人:

model.add(Conv2D(32, kernel_size=(3,3), strides=(1, 1), input_shape=(64, 64, 10)))

您可以在这张图片中看到真正发生的事情: KerasConv2D

如果您想组合不同的频道,您必须使用 Keras 创建不同的塔(接收不同的频道),然后将它们放在一起。

您还可以在this link 中看到正在发生的事情。

【讨论】:

    【解决方案2】:

    Conv3D 的 Input_shape 有 4 个维度(时间序列、宽度、高度、通道)

    在你的情况下:

    input_shape = (10, 64, 64, 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2018-02-25
      • 2021-04-27
      • 2017-03-12
      • 1970-01-01
      相关资源
      最近更新 更多