Keras - output_shape和实际形状之间的差异

时间:2018-03-05 23:07:30

标签: python tensorflow keras

我正在尝试使用来自预训练的ResNet50(keras.applications中包含的那些)的一些层来构建神经网络 为此,我正在使用模型的get_layer方法。像这样。

input = Input(  (224, 224 , 3) )
resnet = ResNet50(weights='imagenet', pooling=max, include_top = False , input_tensor=input  )
firstconv = resnet.get_layer("conv1")

然后我打印出firstconv的形状:

print( firstconv.output_shape )

我得到了预期的结果(根据model.summary()):(?,112,112,64)

然后在代码中我通过输入张量调用firstconv层:

x = firstconv( inputs )

然后我打印出这个x的形状,然后我得到(?,109,109,64)代码断开,因为形状冲突。

我想知道为什么会这样,我该如何解决它。我还在学习keras和深度学习,也许我尝试访问Resnet50中的层的方式有问题。

提前致谢

我正在使用Uppntu 14.04,Keras 2.1.4和Tensorflow 1.6从pip安装为keras的后端。

编辑:

        self.input = Input(  (224, 224 , 3) )

        self.resnet = ResNet50(weights='imagenet', pooling=max, include_top = False , input_tensor=self.input  )

        for layer in self.resnet.layers:
            layer.trainable = False 
        self.firstconv = self.resnet.get_layer("conv1")
        print(" first convt output ") 
        # this outputs (? , 112 , 112 , 3) , the desired shape
        print( self.firstconv.output_shape )
        ... later on the code 
        x = self.firstconv( self.input) 
        print( x.shape ) 
        # this outputs ( ? , 109 , 109 , 64 ), but the expected shape is ( ? , 112 , 112 , 64 )

就是这样。代码之间我没有在self.firstconv或输入

上做任何事情

2 个答案:

答案 0 :(得分:0)

ResNet50的示例代码

model = ResNet50(weights = "imagenet",
                 include_top = False,
                 input_shape = (224,224, 3))
for layer in model.layers:
    layer.trainable = False
x = model.output
# flatten outputs of resnet
x = Flatten()(x)
# add a fully connected layer
predictions = Dense(1, activation = "sigmoid")(x)
# build the model
model_final = Model(inputs = model.input, outputs = predictions)

关于如何重现问题和代码目的,您的描述有点模糊。此处的示例代码提供了使用ResNet50处理输入和输出的正确方法。

答案 1 :(得分:0)

我发现在这种情况下会发生什么奇怪的事。

我在两台不同的机器上工作,当我在第一台(在家里)打印resnet.summary()时,它告诉我,restnet模型的第一层是 conv1 所以我记住了这些信息,并设置在另一台机器上工作,后来经过多次尝试后我终于意识到,在第二台机器上,第一层Resnet是 conv1d_pad ,这一层正在接受( 224,224,3)输入并将其转换为(230,230,3),这是畸形问题的起源。我仍然不知道为什么存在这种差异,但我能够克服这个问题。