我正在尝试实现具有医学成像的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代码中覆盖它,但这会导致更多错误,我很确定可以输入一定量的切片 - 我只是看不出问题出在哪里。
这是我几天头疼的事。
发生的事情是Keras自动将图像中的通道数设置为深度,并使用它来设置最终的过滤器大小。您应该使用Conv2D,因为您有3个暗淡的图像(您可以将其理解为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发生了什么。
Conv3D的Input_shape有4个维度(time_sequence,width,height,channels)
在你的情况下:
input_shape = (10, 64, 64, 1)