Tensorflow 为什么批处理大小在Keras层的方法调用中为None?
我正在Keras中实现一个自定义层。如果我打印传递给Tensorflow 为什么批处理大小在Keras层的方法调用中为None?,tensorflow,keras,Tensorflow,Keras,我正在Keras中实现一个自定义层。如果我打印传递给call方法的输入的形状,我会得到None作为第一个元素。为什么呢?第一个元素不应该是批量大小吗 def call(self, x): print(x.shape) # (None, ...) 当我调用model.fit时,我传递的是批量大小 batch_size = 50 model.fit(x_train, y_train, ..., batch_size=batch_size) 那么,方法调用何时实际调用?在方法call中获
call
方法的输入的形状,我会得到None
作为第一个元素。为什么呢?第一个元素不应该是批量大小吗
def call(self, x):
print(x.shape) # (None, ...)
当我调用model.fit
时,我传递的是批量大小
batch_size = 50
model.fit(x_train, y_train, ..., batch_size=batch_size)
那么,方法
调用
何时实际调用?在方法call
中获得批量大小的推荐方法是什么?None
表示它是一个动态形状。它可以接受任何值,具体取决于您选择的批次大小
默认情况下定义模型时,该模型定义为支持您可以选择的任何批次大小。这就是None
的意思。在TensorFlow 1.*
中,模型的输入是tf.placeholder()
的一个实例
如果未使用指定批量大小的keras.InputLayer()
,则默认情况下会得到第一个维度None
:
将tensorflow导入为tf
model=tf.keras.models.Sequential()
添加(tf.keras.layers.density(单位=2,输入形状=(2,))
打印(model.inputs[0].get_shape().as_list())35;[None,2]
打印(model.inputs[0].op.type==“占位符”)#True
当使用指定批量大小的keras.InputLayer()
时,可以使用固定批量大小定义输入占位符:
将tensorflow导入为tf
model=tf.keras.models.Sequential()
添加(tf.keras.layers.InputLayer((2,),批量大小=50))
添加(tf.keras.layers.density(单位=2,输入形状=(2,))
打印(model.inputs[0].get_shape().as_list())[50,2]
打印(model.inputs[0].op.type==“占位符”)#True
当您为model.fit()
方法指定批大小时,这些输入占位符已经定义,您无法修改其形状。model.fit()
的批大小仅用于分割提供给批的数据
如果使用批大小2
定义输入层,然后将批大小的不同值传递给model.fit()
方法,则会得到ValueError
:
将tensorflow导入为tf
将numpy作为np导入
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.InputLayer((2,),batch_size=2))#我面临同样的问题,发现使用tf.shape(您的_变量)
而不是您的_变量。shape
解决了这个问题。Astf.shape(您的_变量)
将在稍后调用fit函数时动态计算
参考文献
你没有回答我的问题。何时调用call
以及在call
方法中获得批量大小的推荐方法是什么?为什么我们甚至会有或需要第一维度的动态大小?第一个维度不能直接和显式地传递吗?我仍然不明白为什么批大小有None
。为什么呢?如果在定义层时通常没有指定None
,为什么不去掉None
?如果我使用的是顺序?因此,要定义所有层的批量大小,我需要首先向顺序?“model.fit()
的批量大小仅用于分割提供给批量的数据。”,但是如果fit
方法中指定的批大小与占位符中指定的批大小不同怎么办?在这种情况下,您将得到ValueError
。在我的回答之后,模型的call()
在向前传球时被调用。model.call()
依次调用已定义层的call()
方法,向前传递层的值。