1

我目前正在用 tensorflow 训练多个线性分类器,但我发现了一些奇怪的东西。

如果 batch_size 很小,我的结果会更好(模型学得更快)我正在研究 FashionMNIST

epochs = 300
batch_size = 5000

# Create and fit model
model = tf.keras.Sequential()
model.add(Dense(1, activation="linear", input_dim=28*28))
model.add(Dense(10, activation="softmax", input_dim=1))
model.compile(optimizer=Adam(), loss=[categorical_crossentropy], metrics=[categorical_accuracy])
model.fit(x_train, y_one_hot_train, validation_data=(x_val, y_one_hot_val), epochs=epochs, batch_size=batch_size)

结果

批量大小:20000 和 200 个 epoch

loss: 2.7494 - categorical_accuracy: 0.2201 - val_loss: 2.8695 - val_categorical_accuracy: 0.2281

批量大小:10000 和 200 个 epoch

loss: 1.7487 - categorical_accuracy: 0.3336 - val_loss: 1.8268 - val_categorical_accuracy: 0.3331

批量大小:2000 和 200 个 epoch

loss: 1.2906 - categorical_accuracy: 0.5123 - val_loss: 1.3247 - val_categorical_accuracy: 0.5113

批量大小:1000 和 200 个 epoch

loss: 1.1080 - categorical_accuracy: 0.5246 - val_loss: 1.1261 - val_categorical_accuracy: 0.5273

你知道我为什么会得到这样的结果吗?

4

2 回答 2

1

批量大小会显着影响学习。当你将一批通过你的网络时会发生什么是你平均梯度。这个概念是,如果你的批大小足够大,这将为完整数据集的梯度提供足够稳定的估计。通过从数据集中抽取样本,您可以估计梯度,同时显着降低计算成本。你走得越低,你的估计就越不准确,但是在某些情况下,这些嘈杂的梯度实际上可以帮助逃避局部最小值。当它太低时,如果您的数据嘈杂并且可能无法学习或收敛速度非常慢,您的网络权重可能会跳来跳去,从而对总计算时间产生负面影响。

于 2019-11-27T15:15:27.513 回答
0

除了其他答案之外,应该注意的是,在保持 epoch 数量相同的同时增加批量大小将导致整体训练步骤更少。这是因为一个 epoch 是迭代数据一次所需的步数,如果批次越大,这个步数就越小。
例如,将批量大小增加 10 会减少 10 的训练步骤数。所以这并不是一个真正公平的比较。批量大小为 20000 的模型仅获得 600 个训练步骤(每个 epoch 3 个步骤),而批量大小为 1000 的模型获得 12000(每个 epoch 60 个步骤)。

于 2019-11-27T15:47:32.593 回答