Как решить «ValueError: слой` Concatenate` требует ввода с соответствующими формами, за исключением оси concat "? - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь реализовать 3D CNN, но получаю сообщение об ошибке значения, потому что формы ввода не совпадают. Что я делаю не так, чтобы получить эту ошибку, и как я могу исправить эту проблему?

Часть кода, на которую ссылается трассировка, выглядит следующим образом:

    x = conv3d_bn(img_input, 32, 3, 3, 3, strides=(2, 2, 2), padding='same', name='Conv3d_1b_3x3')
    x = conv3d_bn(img_input, 64, 3, 3, 3, strides=(2, 2, 2), padding='same', name='Conv3d_1c_3x3')

    branch_0 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), padding='same', name='MaxPool2d_2a_3x3')(x)

    branch_1 = conv3d_bn(branch_0, 96, 3, 3, 3, padding='same', name='Conv3d_2b_3x3')

    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_2a')

    branch_0 = conv3d_bn(x, 64, 1, 1, 1, padding='same', name='Conv3d_3_0a_1x1')
    branch_0 = conv3d_bn(branch_0, 96, 3, 3, 3, padding='same', name='Conv3d_3c_0b_3x3')

    branch_1 = conv3d_bn(x, 64, 1, 1, 1, padding='same', name='Conv3d_3_1a_1x1')
    branch_1 = conv3d_bn(branch_1, 64, 7, 1, 1, padding='same', name='Conv3d_3c_1b_3x3')
    branch_1 = conv3d_bn(branch_1, 64, 1, 7, 7, padding='same', name='Conv3d_3c_1c_3x3')
    branch_1 = conv3d_bn(branch_1, 96, 3, 3, 3, padding='same', name='Conv3d_3c_1d_3x3')

    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_3a')

    branch_0 = conv3d_bn(x, 192, 1, 1, 1, padding='same', name='Conv3d_3_0a_1x1')

    branch_1 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), padding='same', name='MaxPool2d_0b_3x3')(x)

    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_4a')x = conv3d_bn(img_input, 32, 3, 3, 3, strides=(2, 2, 2), padding='same', name='Conv3d_1b_3x3')
    x = conv3d_bn(img_input, 64, 3, 3, 3, strides=(2, 2, 2), padding='same', name='Conv3d_1c_3x3')

    branch_0 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), padding='same', name='MaxPool2d_2a_3x3')(x)

    branch_1 = conv3d_bn(branch_0, 96, 3, 3, 3, padding='same', name='Conv3d_2b_3x3')

    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_2a')

    branch_0 = conv3d_bn(x, 64, 1, 1, 1, padding='same', name='Conv3d_3_0a_1x1')
    branch_0 = conv3d_bn(branch_0, 96, 3, 3, 3, padding='same', name='Conv3d_3c_0b_3x3')

    branch_1 = conv3d_bn(x, 64, 1, 1, 1, padding='same', name='Conv3d_3_1a_1x1')
    branch_1 = conv3d_bn(branch_1, 64, 7, 1, 1, padding='same', name='Conv3d_3c_1b_3x3')
    branch_1 = conv3d_bn(branch_1, 64, 1, 7, 7, padding='same', name='Conv3d_3c_1c_3x3')
    branch_1 = conv3d_bn(branch_1, 96, 3, 3, 3, padding='same', name='Conv3d_3c_1d_3x3')

    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_3a')

    branch_0 = conv3d_bn(x, 192, 1, 1, 1, padding='same', name='Conv3d_3_0a_1x1')

    branch_1 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), padding='same', name='MaxPool2d_0b_3x3')(x)

    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_4a')

Вот traceback:

Traceback (most recent call last):
  File "train.py", line 292, in <module>
    main(**vars(p.parse_args()))
  File "train.py", line 155, in main
    400, spatial_squeeze=True, endpoint_logit='Logits')
  File "/home/larry/Documents/Projekt/i3dv2.py", line 241, in InceptionI3DV2
    x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_4a')
  File "/home/larry/anaconda3/lib/python3.7/site-packages/keras/layers/merge.py", line 649, in concatenate
    return Concatenate(axis=axis, **kwargs)(inputs)
  File "/home/larry/anaconda3/lib/python3.7/site-packages/keras/engine/base_layer.py", line 463, in __call__
    self.build(unpack_singleton(input_shapes))
  File "/home/larry/anaconda3/lib/python3.7/site-packages/keras/layers/merge.py", line 362, in build
    'Got inputs shapes: %s' % (input_shape))
ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 32, 75, 75, 192), (None, 32, 38, 38, 192)]

Я пытался это

 branch_0 = conv3d_bn(x, 192, 1, 3, 3, padding='same', name='Conv3d_3_0a_1x1')
 branch_1 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), padding='same', name='MaxPool2d_0b_3x3')(x) 
 x = layers.concatenate([branch_0, branch_1], axis=channel_axis, name='mixed_4a') 

все еще получаю ту же ошибку. Может кто-нибудь объяснить, пожалуйста, что именно мне нужно сделать, чтобы устранить эту ошибку. Спасибо.

Ждем ваших комментариев.

1 Ответ

0 голосов
/ 29 января 2020

Ваша ошибка гласит:

  • branch0 форма (None, 32, 75, 75, 192)
  • branch1 форма (None, 32, 38, 38, 192)

Это как вы определили слои (branch0 сохраняет размер, тогда как branch1 объединяется):

branch_0 = conv3d_bn(x, 192, 1, 3, 3, ...)
branch_1 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), ...)(x)

Судя по тому, как вы определили Conv3d_2b_3x3:

branch_0 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), ...)(x)
branch_1 = conv3d_bn(branch_0, 96, 3, 3, 3, ... name='Conv3d_2b_3x3')

Я предполагаю, что вы имели в виду :

branch_0 = MaxPooling3D((1, 3, 3), strides=(1, 2, 2), padding='same', name='MaxPool2d_0b_3x3')(x)
branch_1 = conv3d_bn(branch_0, 192, 1, 1, 1, padding='same', name='Conv3d_3_0a_1x1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...