Reputation: 7894
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?
Upvotes: 1
Views: 70
Reputation: 116
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]))
Upvotes: 1