【问题标题】:Why should the input_shape property of a Conv2D layer be specified only for the first Conv2D layer?为什么只为第一个 Conv2D 层指定 Conv2D 层的 input_shape 属性?
【发布时间】:2021-11-20 10:14:19
【问题描述】:

我是 AI/ML 方面的新手。我正在学习 TensorFlow。在一些教程中,我注意到 Conv2D 层的 input_shape 参数仅用于第一个。代码看起来有点像这样:

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3,3), activation='relu',
                           input_shape=(300,300,3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

在许多示例中,不仅在上述示例中,讲师并未在其中包含该论点。有什么原因吗?

【问题讨论】:

    标签: python tensorflow keras neural-network


    【解决方案1】:

    下一层从上一层的输出中推导出所需的形状。也就是说,MaxPooling2D 层根据Conv2D 层的输出等推导出其输入形状。请注意,在您的顺序模型中,您甚至不需要在第一层定义 input_shape。如果您向其提供真实数据,它能够导出input_shape,这为您提供了更多的灵活性,因为您不必对输入形状进行硬编码:

    import tensorflow as tf
    tf.random.set_seed(1)
    
    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(16, (3,3), activation='relu',),
        tf.keras.layers.MaxPooling2D(2, 2),
        tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    
    print(model(tf.random.normal((1, 300, 300, 3))))
    
    tf.Tensor([[0.6059081]], shape=(1, 1), dtype=float32)
    

    如果将形状不正确的数据(例如 (300, 3) 而不是 (300, 300, 3))传递给您的模型,则会发生错误,因为 Conv2D 层需要不包括批次维度的 3D 输入. 如果您的模型没有input_shape,那么您将无法调用model.summary() 来查看您的网络。首先,您必须使用输入形状构建模型:

    model.build(input_shape=(1, 300, 300, 3))
    model.summary()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 2019-07-09
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多