tf.keras.layers.Conv2D作为模型的第一层是否真的需要input_shape?

时间:2018-11-06 07:14:54

标签: tensorflow keras-layer

根据tf.keras.layers.Conv2D上的the official document

  

在将此层用作模型的第一层时,请提供关键字参数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)

也可以。

问题1:tf.keras.layers.Conv2D作为模型的第一层是否真的需要指定input_shape

Q2:如果不需要,什么时候需要,为什么在正式文件中如此提及?

UPDATE1: Tutorial on tf.keras

  

输入尺寸的数量通常是不必要的,因为可以推断出   第一次使用该图层,但是如果您想   手动指定它,这在某些复杂的模型中很有用。

UPDATE2: TensorFlow源代码中的文档字符串git blame显示该文档是从Keras API(不是TensorFlow keras API)复制而来的。

1 个答案:

答案 0 :(得分:1)

卷积通常不需要输入形状。实际上,您可以为同一网络提供不同的输入形状,但是当给张量流输入形状时,速度要快得多。我认为是这样,为什么要在文档中说明。

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