【问题标题】:Keras - Difference between output_shape and actual shapeKeras - output_shape 和实际形状之间的差异
【发布时间】:2018-03-08 05:29:50
【问题描述】:

我正在尝试使用预训练的 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 内部层的方式有问题。

提前致谢

我正在使用从 pip 安装的 Ubuntu 14.04、Keras 2.1.4 和 Tensorflow 1.6 作为 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 或 input 上做任何事情

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    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 处理输入和输出的正确方法。

    【讨论】:

    • 嗨。它不起作用。在使用 get_layer 访问它们之前,我在所有层中将 trainable 设置为 False,但我仍然遇到相同的形状问题。
    • 如何发布所有代码以便我们可以重新出现该错误。
    • 嗨,我在帖子中添加了一段更完整的代码。谢谢
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 2017-05-30
      • 1970-01-01
      • 2020-11-04
      • 2017-12-20
      • 1970-01-01
      • 2020-02-07
      • 2021-06-10
      • 1970-01-01
      相关资源
      最近更新 更多