根据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)复制而来的。
答案 0 :(得分:1)
卷积通常不需要输入形状。实际上,您可以为同一网络提供不同的输入形状,但是当给张量流输入形状时,速度要快得多。我认为是这样,为什么要在文档中说明。
张量流的原始方法甚至没有输入形状的参数。