首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“`Concatenate`”层需要具有匹配形状的输入。形状:[(无,12,12,128),(无,12,12,32),(无,12,12,32),(无,12,12,64)]

“`Concatenate`”层需要具有匹配形状的输入。形状:[(无,12,12,128),(无,12,12,32),(无,12,12,32),(无,12,12,64)]
EN

Stack Overflow用户
提问于 2021-03-20 22:09:51
回答 1查看 289关注 0票数 1

我试图建立一个小型的暹罗网络,模型功能如下:

代码语言:javascript
复制
def faceRecoModel(input_shape):
    """
    Implementation of the Inception model used for FaceNet
    
    Arguments:
    input_shape -- shape of the images of the dataset
    Returns:
    model -- a Model() instance in Keras
    """
        
    # Define the input as a tensor with shape input_shape
    X_input = Input(input_shape)

    # Zero-Padding
    X = ZeroPadding2D((3, 3))(X_input)
    
    # First Block
    X = Conv2D(64, (7, 7), strides = (2, 2), name = 'conv1')(X)
    X = BatchNormalization(axis = 1, name = 'bn1')(X)
    X = Activation('relu')(X)
    
    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)
    X = MaxPooling2D((3, 3), strides = 2)(X)
    
    # Second Block
    X = Conv2D(64, (1, 1), strides = (1, 1), name = 'conv2')(X)
    X = BatchNormalization(axis = 1, epsilon=0.00001, name = 'bn2')(X)
    X = Activation('relu')(X)
    
    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)

    # Second Block
    X = Conv2D(192, (3, 3), strides = (1, 1), name = 'conv3')(X)
    X = BatchNormalization(axis = 1, epsilon=0.00001, name = 'bn3')(X)
    X = Activation('relu')(X)
    
    # Zero-Padding + MAXPOOL
    X = ZeroPadding2D((1, 1))(X)
    X = MaxPooling2D(pool_size = 3, strides = 2)(X)
    
    # Inception 1: a/b/c
    X = inception_block_1a(X)
    X = inception_block_1b(X)
    X = inception_block_1c(X)
    
    # Inception 2: a/b
    X = inception_block_2a(X)
    X = inception_block_2b(X)
    
    # Inception 3: a/b
    X = inception_block_3a(X)
    X = inception_block_3b(X)
    
    # Top layer
    X = AveragePooling2D(pool_size=(3, 3), strides=(1, 1), data_format='channels_first')(X)
    X = Flatten()(X)
    X = Dense(128, name='dense_layer')(X)
    
    # L2 normalization
    X = Lambda(lambda  x: K.l2_normalize(x,axis=1))(X)

    # Create model instance
    model = Model(inputs = X_input, outputs = X, name='FaceRecoModel')
        
    return model

如果我试图以以下方式运行该函数:

代码语言:javascript
复制
network = faceRecoModel(input_shape=(96, 96, 3))

然后将错误显示为:

代码语言:javascript
复制
ValueError                                Traceback (most recent call last)
<ipython-input-25-50d215e607a1> in <module>
----> 1 network = faceRecoModel(input_shape=(96, 96, 3))

~/Documents/inception_block_model.py in faceRecoModel(input_shape)
    276 
    277     # Inception 1: a/b/c
--> 278     X = inception_block_1a(X)
    279     X = inception_block_1b(X)
    280     X = inception_block_1c(X)

~/Documents/inception_block_model.py in inception_block_1a(X)
     66 
     67     # CONCAT
---> 68     inception = concatenate([X_3x3, X_5x5, X_pool, X_1x1], axis=-1)
     69 
     70     return inception

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/layers/merge.py in concatenate(inputs, axis, **kwargs)
    929       A tensor, the concatenation of the inputs alongside axis `axis`.
    930   """
--> 931   return Concatenate(axis=axis, **kwargs)(inputs)
    932 
    933 

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self, *args, **kwargs)
    950     if _in_functional_construction_mode(self, inputs, args, kwargs, input_list):
    951       return self._functional_construction_call(inputs, args, kwargs,
--> 952                                                 input_list)
    953 
    954     # Maintains info about the `Layer.call` stack.

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in _functional_construction_call(self, inputs, args, kwargs, input_list)
   1089         # Check input assumptions set after layer building, e.g. input shape.
   1090         outputs = self._keras_tensor_symbolic_call(
-> 1091             inputs, input_masks, args, kwargs)
   1092 
   1093         if outputs is None:

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in _keras_tensor_symbolic_call(self, inputs, input_masks, args, kwargs)
    820       return nest.map_structure(keras_tensor.KerasTensor, output_signature)
    821     else:
--> 822       return self._infer_output_signature(inputs, args, kwargs, input_masks)
    823 
    824   def _infer_output_signature(self, inputs, args, kwargs, input_masks):

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in _infer_output_signature(self, inputs, args, kwargs, input_masks)
    860           # overridden).
    861           # TODO(kaftan): do we maybe_build here, or have we already done it?
--> 862           self._maybe_build(inputs)
    863           outputs = call_fn(inputs, *args, **kwargs)
    864 

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in _maybe_build(self, inputs)
   2708         # operations.
   2709         with tf_utils.maybe_init_scope(self):
-> 2710           self.build(input_shapes)  # pylint:disable=not-callable
   2711       # We must set also ensure that the layer is marked as built, and the build
   2712       # shape is stored since user defined build functions may not be calling

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/utils/tf_utils.py in wrapper(instance, input_shape)
    270     if input_shape is not None:
    271       input_shape = convert_shapes(input_shape, to_tuples=True)
--> 272     output_shape = fn(instance, input_shape)
    273     # Return shapes from `fn` as TensorShapes.
    274     if output_shape is not None:

~/.local/lib/python3.7/site-packages/tensorflow/python/keras/layers/merge.py in build(self, input_shape)
    517             shape[axis] for shape in shape_set if shape[axis] is not None)
    518         if len(unique_dims) > 1:
--> 519           raise ValueError(err_msg)
    520 
    521   def _merge_function(self, inputs):

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 12, 12, 128), (None, 12, 12, 32), (None, 12, 12, 32), (None, 12, 12, 64)]

我什么都试过了,但似乎找不到这个问题的答案。

显示错误的函数如下:

代码语言:javascript
复制
def inception_block_1a(X):
    """
    Implementation of an inception block
    """
    
    X_3x3 = Conv2D(96, (1, 1), name ='inception_3a_3x3_conv1')(X)
    X_3x3 = BatchNormalization(axis=1, epsilon=0.00001, name = 'inception_3a_3x3_bn1')(X_3x3)
    X_3x3 = Activation('relu')(X_3x3)
    X_3x3 = ZeroPadding2D(padding=(1, 1))(X_3x3)
    X_3x3 = Conv2D(128, (3, 3), name='inception_3a_3x3_conv2')(X_3x3)
    X_3x3 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_3x3_bn2')(X_3x3)
    X_3x3 = Activation('relu')(X_3x3)
    
    X_5x5 = Conv2D(16, (1, 1), name='inception_3a_5x5_conv1')(X)
    X_5x5 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_5x5_bn1')(X_5x5)
    X_5x5 = Activation('relu')(X_5x5)
    X_5x5 = ZeroPadding2D(padding=(2, 2))(X_5x5)
    X_5x5 = Conv2D(32, (5, 5), name='inception_3a_5x5_conv2')(X_5x5)
    X_5x5 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_5x5_bn2')(X_5x5)
    X_5x5 = Activation('relu')(X_5x5)

    X_pool = MaxPooling2D(pool_size=3, strides=2)(X)
    X_pool = Conv2D(32, (1, 1), name='inception_3a_pool_conv')(X_pool)
    X_pool = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_pool_bn')(X_pool)
    X_pool = Activation('relu')(X_pool)
    X_pool = ZeroPadding2D(padding=((3, 4), (3, 4)))(X_pool)

    X_1x1 = Conv2D(64, (1, 1), name='inception_3a_1x1_conv')(X)
    X_1x1 = BatchNormalization(axis=1, epsilon=0.00001, name='inception_3a_1x1_bn')(X_1x1)
    X_1x1 = Activation('relu')(X_1x1)
        
    # CONCAT
    inception = concatenate([X_3x3, X_5x5, X_pool, X_1x1], axis=-1)
    return inception
EN

回答 1

Stack Overflow用户

发布于 2021-12-15 10:32:58

正如错误消息所述,tf.keras.layers.concatenate接受具有匹配形状的输入。当输入的形状不同时,使axis=1,如tf.keras.layers.concatenate([x, y],axis=1)

我可以复制你的问题

代码语言:javascript
复制
import numpy as np
import tensorflow as tf
x = np.arange(20).reshape(2, 2, 5)
y = np.arange(20, 30).reshape(2, 1, 5)
tf.keras.layers.concatenate([x, y],axis=-1)

输出

代码语言:javascript
复制
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-0084e00eb8b5> in <module>()
      4 y = np.arange(20, 30).reshape(2, 1, 5)
      5 tf.keras.layers.concatenate([x, y],
----> 6                             axis=-1)

2 frames
/usr/local/lib/python3.7/dist-packages/keras/layers/merge.py in build(self, input_shape)
    523             shape[axis] for shape in shape_set if shape[axis] is not None)
    524         if len(unique_dims) > 1:
--> 525           raise ValueError(err_msg)
    526 
    527   def _merge_function(self, inputs):

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concatenation axis. Received: input_shape=[(2, 2, 5), (2, 1, 5)]

工作样例代码

代码语言:javascript
复制
import numpy as np
import tensorflow as tf
x = np.arange(20).reshape(2, 2, 5)
y = np.arange(20, 30).reshape(2, 1, 5)
tf.keras.layers.concatenate([x, y],axis=1)

输出

代码语言:javascript
复制
<tf.Tensor: shape=(2, 3, 5), dtype=int64, numpy=
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [20, 21, 22, 23, 24]],

       [[10, 11, 12, 13, 14],
        [15, 16, 17, 18, 19],
        [25, 26, 27, 28, 29]]])>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66726947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档