Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:“Concatenate”层要求输入具有匹配形状,concat轴除外_Python_Tensorflow_Keras - Fatal编程技术网

Python ValueError:“Concatenate”层要求输入具有匹配形状,concat轴除外

Python ValueError:“Concatenate”层要求输入具有匹配形状,concat轴除外,python,tensorflow,keras,Python,Tensorflow,Keras,我试图用Keras函数API实现一种特殊类型的神经网络,如下所示: 但我对连接层有一个问题: ValueError:“连接”层需要具有匹配形状的输入 除了concat轴。获取输入形状:[(无、160、160、384), (无、160、160、48)] 注意:根据我的研究,我假设这个问题不是重复的,我已经看到了,并且(用谷歌翻译),但它们似乎不起作用(相反,它们会使问题稍微“更糟”) 下面是concat层之前的神经网络代码: from keras.layers import Input, De

我试图用Keras函数API实现一种特殊类型的神经网络,如下所示:

但我对连接层有一个问题:

ValueError:“连接”层需要具有匹配形状的输入 除了concat轴。获取输入形状:[(无、160、160、384), (无、160、160、48)]

注意:根据我的研究,我假设这个问题不是重复的,我已经看到了,并且(用谷歌翻译),但它们似乎不起作用(相反,它们会使问题稍微“更糟”)


下面是concat层之前的神经网络代码:

from keras.layers import Input, Dense, Conv2D, ZeroPadding2D, MaxPooling2D, BatchNormalization, concatenate
from keras.activations import relu
from keras.initializers import RandomUniform, Constant, TruncatedNormal

#  Network 1, Layer 1
screenshot = Input(shape=(1280, 1280, 0), dtype='float32', name='screenshot')
# padded1 = ZeroPadding2D(padding=5, data_format=None)(screenshot)
conv1 = Conv2D(filters=96, kernel_size=11, strides=(4, 4), activation=relu, padding='same')(screenshot)
# conv1 = Conv2D(filters=96, kernel_size=11, strides=(4, 4), activation=relu, padding='same')(padded1)
pooling1 = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')(conv1)
normalized1 = BatchNormalization()(pooling1)  # https://stats.stackexchange.com/questions/145768/importance-of-local-response-normalization-in-cnn

# Network 1, Layer 2

# padded2 = ZeroPadding2D(padding=2, data_format=None)(normalized1)
conv2 = Conv2D(filters=256, kernel_size=5, activation=relu, padding='same')(normalized1)
# conv2 = Conv2D(filters=256, kernel_size=5, activation=relu, padding='same')(padded2)
normalized2 = BatchNormalization()(conv2)
# padded3 = ZeroPadding2D(padding=1, data_format=None)(normalized2)
conv3 = Conv2D(filters=384, kernel_size=3, activation=relu, padding='same',
               kernel_initializer=TruncatedNormal(stddev=0.01),
               bias_initializer=Constant(value=0.1))(normalized2)
# conv3 = Conv2D(filters=384, kernel_size=3, activation=relu, padding='same',
#               kernel_initializer=RandomUniform(stddev=0.1),
#               bias_initializer=Constant(value=0.1))(padded3)

# Network 2, Layer 1

textmaps = Input(shape=(160, 160, 128), dtype='float32', name='textmaps')
txt_conv1 = Conv2D(filters=48, kernel_size=1, activation=relu, padding='same',
                   kernel_initializer=TruncatedNormal(stddev=0.01), bias_initializer=Constant(value=0.1))(textmaps)

# (Network 1 + Network 2), Layer 1

merged = concatenate([conv3, txt_conv1], axis=1)
这就是解释器如何计算变量
conv3
txt\u conv1

>>> conv3
<tf.Tensor 'conv2d_3/Relu:0' shape=(?, 160, 160, 384) dtype=float32>
>>> txt_conv1
<tf.Tensor 'conv2d_4/Relu:0' shape=(?, 160, 160, 48) dtype=float32>
这两个层都具有架构中未实际描述的形状


有没有办法解决这个问题?也许我没有编写适当的代码(我是Keras的新手)

附言

我知道上面的代码没有组织,我只是在测试


谢谢大家!

在连接层中,应将轴更改为-1,因为要连接的两个张量的形状仅在最后一个维度上不同。生成的张量将是
(?,160,160,384+48)

这是一个快速修复,奇怪的是基于Caffe的神经网络定义使用
axis=1
作为连接层,这就是我选择它的原因。但不管怎样,新形状的尺寸是432,如架构中所述。非常感谢。
>>> conv3
<tf.Tensor 'conv2d_3/Relu:0' shape=(?, 384, 160, 0) dtype=float32>
>>> txt_conv1
<tf.Tensor 'conv2d_4/Relu:0' shape=(?, 48, 160, 128) dtype=float32>