文档指出model.fit将返回一个History包含在训练期间评估的各种指标的对象。这些指标也会在训练期间打印到标准输出(例如,请参阅此问题)。文档指出历史对象是连续时期的训练损失值和指标值的记录,[...]现在我想知道这些指标是作为每个样本的平均值还是作为每个批次的平均值给出的?假设我有model.fit(x, y, batch_size=16, ...). 给出的指标是否为在批次内累积和平均的(即一个值将对应于批次中 16 个样本的组合值)?或者它们是按样本给出的(即整个数据集的平均值)?编辑显然,度量不是按样本计算的,而是按输出计算的。这在model.fit;的文档中松散地表明了。也就是说,如果为每个输出节点指定不同的损失,那么总损失将被最小化。这表明两件事:首先,损失(指标)不是按样本计算的,而是按输出计算的(尽管在批次内和批次内平均)。如果每个输出的损失(度量)在各种输出上取平均值,那么这个过程将类似于每个样本的计算。然而,其次,文档表明不同输出的损失相加而不是平均。所以这需要更多的调查。深入研究源代码表明,确实每个输出都存储了损失函数。如果我们没有为各种输出手动指定任何权重,默认情况下将分配一个权重。那么相关的损失计算部分就从这里开始。损失被求和,似乎没有取平均值。好吧,我们应该从一个快速实验中看到这一点:from keras.initializers import Ones, Zerosfrom keras.models import Sequentialfrom keras.layers import Denseimport numpy as npx = np.arange(16).reshape(8, 2).astype(float)y = np.zeros((8, 2), dtype=float)model = Sequential()model.add(Dense(2, input_dim=2, kernel_initializer=Ones(), bias_initializer=Zeros(), trainable=False))model.compile('sgd', loss='mean_absolute_error', metrics=['mean_absolute_error', 'mean_squared_error'])# Metrics per sample and output.ae = np.abs(np.sum(x, axis=1)[:, None] - y) # Absolute error.se = (np.sum(x, axis=1)[:, None] - y)**2 # Squared error.print('Expected metrics for averaging over samples but summing over outputs:')print(f'\tMAE: {np.sum(np.mean(ae, axis=0))}, MSE: {np.sum(np.mean(se, axis=0))}', end='\n\n')print('Expected metrics for averaging over samples and averaging over outputs:')print(f'\tMAE: {np.mean(np.mean(ae, axis=0))}, MSE: {np.mean(np.mean(se, axis=0))}')for batch_size in [1, 2, 4, 8]: print(f'\n# Batch size: {batch_size}') model.fit(x, y, batch_size=batch_size, epochs=1, shuffle=False)
添加回答
举报
0/150
提交
取消