python - 如何解决“ValueError:“连接”层需要具有匹配形状的输入,连接轴除外”?
问题描述
我正在尝试实现 3D CNN,但由于输入形状不匹配,我收到一条值错误消息。我做错了什么来得到这个错误,我该如何解决这种问题?
traceback 中引用的部分代码如下:
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 (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')
仍然得到同样的错误。有人可以准确解释我需要做什么来解决这个错误。谢谢。
期待您的评论。
解决方案
您的错误指出:
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')
推荐阅读
- html - 从外部 HTML 显示视图
- php - 如何在php多维中搜索键值并返回仅包含搜索值的数组
- python - python:使用参考图像和来自相机的当前图像查找相机移位角度
- spring - 在 Spring-MVC 中使用会话
- antlr4 - Antlr4:使用属性值中的嵌套标记解析 JSP 标记
- amazon-web-services - Amazon CloudWatch:如何查找 CloudWatch 日志组的 ARN
- r - 如何按天汇总每个日期的每个实例?
- sql - 主键也是星型模式中的外键。是好是坏?
- javascript - 禁用拖放图像羽毛笔js
- python - Tweepy 只返回 1 条推文