Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 为什么批处理大小在Keras层的方法调用中为None?_Tensorflow_Keras - Fatal编程技术网

Tensorflow 为什么批处理大小在Keras层的方法调用中为None?

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中获

我正在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
中获得批量大小的推荐方法是什么?

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
解决了这个问题。As
tf.shape(您的_变量)
将在稍后调用fit函数时动态计算

参考文献

你没有回答我的问题。何时调用
call
以及在
call
方法中获得批量大小的推荐方法是什么?为什么我们甚至会有或需要第一维度的动态大小?第一个维度不能直接和显式地传递吗?我仍然不明白为什么批大小有
None
。为什么呢?如果在定义层时通常没有指定
None
,为什么不去掉
None
?如果我使用的是
顺序
?因此,要定义所有层的批量大小,我需要首先向
顺序
?“model.fit()
的批量大小仅用于分割提供给批量的数据。”,但是如果
fit
方法中指定的批大小与占位符中指定的批大小不同怎么办?在这种情况下,您将得到
ValueError
。在我的回答之后,模型的
call()
在向前传球时被调用。
model.call()
依次调用已定义层的
call()
方法,向前传递层的值。