Search code examples
kerasdeep-learning

keras.layers.MaxPool3D: ValueError


I have the following code:

from functools import partial

from tensorflow import keras

DefaultConv3D = partial(keras.layers.Conv3D, kernel_size=3, strides=1,
                        padding="SAME", use_bias=False)


class ResidualUnit(keras.layers.Layer):
    def __init__(self, filters, strides=1, activation="relu", **kwargs):
        super().__init__(**kwargs)
        self.activation = keras.activations.get(activation)
        self.main_layers = [
            DefaultConv3D(filters, strides=strides),
            keras.layers.BatchNormalization(),
            self.activation,
            DefaultConv3D(filters),
            keras.layers.BatchNormalization()]
        self.skip_layers = []
        if strides > 1:
            self.skip_layers = [
                DefaultConv3D(filters, kernel_size=1, strides=strides),
                keras.layers.BatchNormalization()]

    def call(self, inputs):
        Z = inputs
        for layer in self.main_layers:
            Z = layer(Z)
        skip_Z = inputs
        for layer in self.skip_layers:
            skip_Z = layer(skip_Z)
        return self.activation(Z + skip_Z)


def get_model():
    model = keras.models.Sequential()
    model.add(DefaultConv3D(64, kernel_size=7, strides=2,
                            input_shape=[None, 197, 233, 189, 1]))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Activation("relu"))
    model.add(keras.layers.MaxPool3D(pool_size=3, strides=2, padding="SAME"))
    prev_filters = 64
    for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3:
        strides = 1 if filters == prev_filters else 2
        model.add(ResidualUnit(filters, strides=strides))
        prev_filters = filters
    model.add(keras.layers.GlobalAvgPool3D())
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(1))

    return model

It is returning the following error:

  File "/home/miran045/reine097/projects/resnet34/venv/lib/python3.6/site-packages/keras/engine/base_layer.py", line 848, in _keras_tensor_symbolic_call
    return self._infer_output_signature(inputs, args, kwargs, input_masks)
  File "/home/miran045/reine097/projects/resnet34/venv/lib/python3.6/site-packages/keras/engine/base_layer.py", line 886, in _infer_output_signature
    self._maybe_build(inputs)
  File "/home/miran045/reine097/projects/resnet34/venv/lib/python3.6/site-packages/keras/engine/base_layer.py", line 2634, in _maybe_build
    self.input_spec, inputs, self.name)
  File "/home/miran045/reine097/projects/resnet34/venv/lib/python3.6/site-packages/keras/engine/input_spec.py", line 218, in assert_input_compatibility
    str(tuple(shape)))
ValueError: Input 0 of layer max_pooling3d is incompatible with the layer: expected ndim=5, found ndim=6. Full shape received: (None, None, 99, 117, 95, 64)

What am I doing wrong here?


Solution

  • It looks like you've added an extra dimension for the batch size in the input. Keras does this internally so you can exclude it when defining the input_shape.

    Just change:

    model.add(DefaultConv3D(64, kernel_size=7, strides=2,
                            input_shape=[None, 197, 233, 189, 1]))
    

    to

    model.add(DefaultConv3D(64, kernel_size=7, strides=2,
                            input_shape=[197, 233, 189, 1]))