1

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?

1 Answer 1

1

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]))
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.