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?
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]))