如何使用Keras Conv3D为3D数据实现简单的CNN

时间:2017-12-13 17:22:18

标签: image keras convolution

我正在尝试实现具有医学成像的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代码中覆盖它,但这会导致更多错误,我很确定可以输入大量切片 - 我只是无法查看问题所在。

2 个答案:

答案 0 :(得分:1)

这是我几天以来的头痛。

发生的事情是Keras自动将图像中的通道数设置为深度,并使用它来设置最终的滤镜大小。由于具有3暗的图像(您可以将其理解为RGB图像),因此应改用 Conv2D

正如我所说,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中发生的事情。

答案 1 :(得分:0)

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

在您的情况下:

class_name cs;
emit cs.inprogress(progr);