alueError: Input 0 of layer sequential is incompatible with the layer for 3D autoenccoder

alueError: Input 0 of layer sequential is incompatible with the layer for 3D autoenccoder

我有一个灰度 3d 图像 (32, 32, 32)(是从磁共振图像中获取的图像),我正在尝试用它构建一个简单的自动编码器。我遇到的问题是当我尝试使模型适合图像时 (model.fit()) 因为我收到此错误:

ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=5, found ndim=4. Full shape received: (32, 32, 32, 1)

这是一张 .nii 图片。取自其他对 conv2d 提出相同问题的帖子,我尝试调整一些答案并进行了重塑,但我不知道为什么它仍然期望 ndim = 5,不应该是 ndim 5 keras 内部添加的批次维度吗? ?

这是我所做的:

cube = np.array(cube.get_fdata())
cube = cube.reshape(32, 32, 32, 1) 

这是我构建的自动编码器(这是我第一次为 3D 图像构建它,所以如果有什么问题请告诉我):

sample_shape = (32, 32, 32, 1)
model = Sequential()
model.add(Conv3D(64, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform', input_shape=sample_shape))
model.add(MaxPooling3D(pool_size=(2, 2, 2), padding='same'))
model.add(Conv3D(32, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(MaxPooling3D(pool_size=(2, 2, 2), padding='same'))
model.add(Conv3D(16, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(MaxPooling3D(pool_size=(2, 2, 2), padding='same'))
model.add(Conv3D(8, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(MaxPooling3D(pool_size=(2, 2, 2), padding='same'))
     
model.add(Conv3D(8, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(UpSampling3D(size=(2, 2, 2)))
model.add(Conv3D(16, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(UpSampling3D(size=(2, 2, 2)))
model.add(Conv3D(32, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(UpSampling3D(size=(2, 2, 2)))
model.add(Conv3D(64, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))
model.add(UpSampling3D(size=(2, 2, 2)))
model.add(Conv3D(3, kernel_size=(3, 3, 3), activation='relu', padding='same', kernel_initializer='he_uniform'))

model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
model.summary()

谢谢!

让我们解压缩数据的每个维度。

cube = np.array(cube.get_fdata())
cube = cube.reshape(32, 32, 32, 1)
# should be the line below. -1 means infer that number from the data
# cube = cube.reshape(-1, 32, 32, 32, 1)

三个32是你的3D数据,1是因为input只有一个通道。您需要在前 32 个之前添加另一个数字以指示批量大小。在任何神经网络中,您都需要在输入中包含批量大小。 Keras、PyTorch 或任何其他 ML 库不会为您处理此问题。

例如。让我们考虑一下 MNIST 数据集。每个数字都有 (28, 28, 1) 的形状,但是当我们通过网络 运行 数据时,我们必须将其重新整形为 (1, 28, 28, 1).