model.evaluate()中batch_size的含义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了model.evaluate()中batch_size的含义相关的知识,希望对你有一定的参考价值。

我正在建造一个普通的香草FNN,并希望在训练后评估我的模型。我想知道在测试集上评估模型时batch_size有什么影响。当然,它与训练相关,因为它在计算下一个梯度之前确定要馈送到网络的样本数。同样清楚的是,在预测(有状态的)RNN的值时可能需要它。但是我不清楚为什么在评估模型尤其是FNN时需要它。此外,当我在同一测试集上评估模型但具有不同的批量大小时,我会得到略微不同的值。考虑以下玩具示例:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD

# function to be learned
def f(x):
    return x[0] + x[1] + x[2]

# sample training and test points on a rectangular grid
x_train = np.random.uniform(low = -10, high = 10, size = (50,3))
y_train = np.apply_along_axis(f, 1, x_train).reshape(-1,1)

x_test = np.random.uniform(low = -10, high = 10, size = (50,3))
y_test = np.apply_along_axis(f, 1, x_test).reshape(-1,1)

model = Sequential()
model.add(Dense(20, input_dim = 3, activation = 'tanh'))
model.add(Dense(1))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mse',
      optimizer=sgd)
model.fit(x_train, y_train, batch_size = 10, epochs = 30, verbose = 0)

model.evaluate(x_test, y_test, batch_size = 10)
model.evaluate(x_test, y_test, batch_size = 20)
model.evaluate(x_test, y_test, batch_size = 30)
model.evaluate(x_test, y_test, batch_size = 40)
model.evaluate(x_test, y_test, batch_size = 50)

值非常相似,但仍然不同。这是从哪里来的?以下不应该总是如此吗?

from sklear.metrics import mean_squared_error as mse
0 == model.evaluate(x_test, y_test) - mse(model.predict(x_test), y_test)
答案

不,他们不一定是一样的。如果将浮点数学与并行性结合起来,则不会得到可重现的结果,因为(a + b)+ c与a +(b + c)不同。

由于网络可以一次处理多个样本,因此模型的评估函数具有批量大小以便加速评估,并且使用GPU可以使评估更快。我认为减少这种影响的唯一方法是将batch_size设置为1。

另一答案

评估值的不同之处仅在于浮点值缺乏精度。

在评估中使用批量大小的原因与在训练模式中使用批量大小相同。原因不像你说的那样:

它与训练相关,因为它在计算下一个梯度之前确定要馈送到网络的样本数

想一想,为什么不批量生产所有数据集?因为RAM中没有足够的内存来存储所有内存。这也是评估时的原因。

以上是关于model.evaluate()中batch_size的含义的主要内容,如果未能解决你的问题,请参考以下文章

Keras model.evaluate() 和 model.predict() 有啥区别?

tensorflow model.evaluate 和 model.predict 非常不同的结果

Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异

Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同

Keras model.evaluate_generator结果几乎是真实准确度的两倍?

tensorflow CNN 模型的 model.evaluate 和 model.predict 之间的准确性差异巨大