model.evaluate() 中batch_size 的含义

lbf*_*994 8 python deep-learning keras

我正在构建一个普通的 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)
Run Code Online (Sandbox Code Playgroud)

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

from sklear.metrics import mean_squared_error as mse
0 == model.evaluate(x_test, y_test) - mse(model.predict(x_test), y_test)
Run Code Online (Sandbox Code Playgroud)

Mat*_*gro 5

不,它们不必相同。如果将浮点数学与并行性结合起来,则不会得到可重复的结果,因为 (a + b) + c 与 a + (b + c) 不同。

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