evaluate
函数实际上如何工作,返回的确切内容是什么?
这是evaluate
文档中tf.keras.models.Model
的接口定义。
evaluate(
x=None,
y=None,
batch_size=None,
verbose=1,
sample_weight=None,
steps=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False
)
文档说,该函数返回测试模式下模型的损失值和指标值。
这里有两个参数很重要:
批处理大小:整数或无。每个梯度更新的样本数。如果 未指定,batch_size将默认为32。请勿指定 batch_size(如果您的数据采用符号张量,数据集, 数据集迭代器,生成器或keras.utils.Sequence实例 (因为它们会生成批次)。
步骤:整数或无。总步骤数(一批样品) 在宣布评估轮结束之前。忽略了 默认值为无。
文档对我来说有点含糊。我不明白“请勿指定以下内容”一词中的 数据集 是什么意思 batch_size(如果您的数据采用符号张量的形式), 数据集 ....”
就我而言,我的模型有多个输入,而输入x
是一个numpy数组的列表。我的x如下所示:
print(len(x)) returns 4
print(x[0].shape) returns (128, 9, 16)
重要的是,数据集(在此示例中为训练集)中包含128个示例。
在这种情况下,我对如何调用评估函数感到非常困惑?我特别想知道如何设置 batch_size 和 steps 参数。
我可以按以下方式运行它:
替代1:
train_metrics = saved_model.evaluate(x = train_x,
y = train_y,
batch_size = None,
steps = None)
或者我也可以如下运行它:
替代2:
train_metrics = saved_model.evaluate(x = train_x,
y = train_y,
batch_size = 64,
steps = None)
假设我拥有上述格式的数据集,那么2个替代方案之间有什么区别?我实际上希望看到相同的结果(尤其是“丢失”),因为评估函数应该只遍历给定的数据集一次,并且应该为整个数据集返回结果。但这没有发生。上面的2个选择给出的结果截然不同。
有人清楚知道这两个电话之间有什么区别吗?
我也尝试检查代码,但无法真正找出细节。
答案 0 :(得分:2)
我不明白“如果您的数据采用符号张量,数据集...的形式,请不要指定batch_size”一句中的数据集是什么意思
此处引用的数据集是tf.data.Dataset()
的实例。数据集已经定义了其batch_size
。我们使用以下命令定义它:
tf.data.Dataset.batch( batch_size )
因此,在Keras evaluate
方法中不需要参数。
steps
参数是什么?
步长是将样本总数除以批次大小的时间。如果我有1000个样本,并且batch_size为50,则步骤数将为20(1000/50)。您不需要主要输入steps
参数。
第一替代方案:
批量大小设置为“无”。因此,将使用默认值32。因此,在此,根据计算,步数将为4(128/32)。
第二种替代方法:
批处理大小设置为64。因此,在此,根据计算,步数将为2(128/64)。
替代方案之间的区别:
这两种选择的批次大小分别为32和64。因此,损失和准确性的计算方式会有所不同。