【发布时间】: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)复制而来的。
【问题讨论】: