【问题标题】:Does tf.keras.layers.Conv2D as first layer in model truly need input_shape?tf.keras.layers.Conv2D 作为模型中的第一层真的需要 input_shape 吗?
【发布时间】:2018-11-06 07:14:54
【问题描述】:

根据the official documenttf.keras.layers.Conv2D

当将此层用作模型中的第一层时,提供关键字参数 input_shape(整数元组,不包括样本轴),例如input_shape=(128, 128, 3) 用于 data_format="channels_last" 中的 128x128 RGB 图片。

但实际上没有 input_shape 它在图形执行和急切执行环境中都可以工作。

在图执行中,

import tensorflow as tf
from tensorflow.keras.layers import Conv2D, Flatten, Dense

class CNN(tf.keras.Model):

    def __init__(self):
        super(CNN, self).__init__()
        self.conv = Conv2D(1, 3, padding='same', data_format='channels_first')
        self.flatten = Flatten()
        self.dense = Dense(1)

    def call(self, inputs):
        x = self.conv(inputs)
        x = self.flatten(x)
        return self.dense(x)


cnn = CNN()
inputs = tf.random_uniform([2, 3, 16, 16])
outputs = cnn(inputs)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    outputs = sess.run(outputs)
    print(outputs)

工作没有任何错误,并且在急切的执行中,

import tensorflow as tf
from tensorflow.keras.layers import Conv2D, Flatten, Dense
tf.enable_eager_execution()

class CNN(tf.keras.Model):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv = Conv2D(1, 3, padding='same', data_format='channels_first')
        self.flatten = Flatten()
        self.dense = Dense(1)

    def call(self, inputs):
        x = self.conv(inputs)
        x = self.flatten(x)
        return self.dense(x)


cnn = CNN()
inputs = tf.random_uniform([2, 3, 16, 16])
outputs = cnn(inputs)
print(outputs)

也有。

Q1:tf.keras.layers.Conv2D 作为模型的第一层真的需要指定input_shape吗?

Q2:如果不需要,什么时候需要,为什么官方文档里这么说?

更新1: Tutorial on tf.keras

输入维度的数量通常是不必要的,因为它可以被推断出来 第一次使用该层,但如果您愿意,可以提供 手动指定,这在一些复杂的模型中很有用。

更新2: TensorFlow 源码中的 docstring 的git blame 透露,该文档是从 Keras API(不是 TensorFlow keras API)复制而来的。

【问题讨论】:

    标签: tensorflow keras-layer


    【解决方案1】:

    卷积通常不需要输入形状。实际上,您可以为同一个网络提供不同的输入形状,但是当您为 tensorflow 提供输入形状时,它会快得多。我认为原因,为什么它在文档中说明。

    tensorflow的原始方法甚至没有输入形状的参数。

    【讨论】:

    • 谢谢!顺便说一句,The original method of tensorflow 指的是什么?
    • 如果您的答案是正确的,我可以在初始化时而不是在构建时修复input_shape 吗?或者这个问题应该问另一个线程吗?
    • 在后台使用tf.nn.conv2d。 (tensorflow.org/api_docs/python/tf/nn/conv2d) 但 keras 调用的是 C++ API 而不是 python。
    • 修复是什么意思?
    • fix 表示指定。换句话说,我可以不在初始化时而是在构建时指定input_shape 吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 2017-01-28
    • 2015-08-11
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    相关资源
    最近更新 更多