【发布时间】:2019-04-14 17:26:36
【问题描述】:
我一直试图更好地理解keras 模型fit() 循环中的训练/验证序列。因此,我尝试了一个简单的训练循环,尝试使用由单个特征组成的输入数据拟合一个简单的逻辑回归模型。
我为训练和验证提供相同的数据。在这些条件下,通过将批量大小指定为与总数据大小相同,人们会期望获得完全相同的损失和准确度。但这种情况并非如此。
这是我的代码:
用两个类生成一些两个随机数据:
N = 100
x = np.concatenate([np.random.randn(N//2, 1), np.random.randn(N//2, 1)+2])
y = np.concatenate([np.zeros(N//2), np.ones(N//2)])
并绘制两类数据分布(一个特征x):
data = pd.DataFrame({'x': x.ravel(), 'y': y})
sns.violinplot(x='x', y='y', inner='point', data=data, orient='h')
pyplot.tight_layout(0)
pyplot.show()
构建并拟合 keras 模型:
model = tf.keras.Sequential([tf.keras.layers.Dense(1, activation='sigmoid', input_dim=1)])
model.compile(optimizer=tf.keras.optimizers.SGD(2), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(x, y, epochs=10, validation_data=(x, y), batch_size=N)
请注意,我已经为训练和validation_data 指定了数据x 和目标y。此外,batch_size 与总大小 batch_size=N 相同。
训练结果为:
100/100 [==============================] - 1s 5ms/step - loss: 1.4500 - acc: 0.2300 - val_loss: 0.5439 - val_acc: 0.7200
Epoch 2/10
100/100 [==============================] - 0s 18us/step - loss: 0.5439 - acc: 0.7200 - val_loss: 0.4408 - val_acc: 0.8000
Epoch 3/10
100/100 [==============================] - 0s 16us/step - loss: 0.4408 - acc: 0.8000 - val_loss: 0.3922 - val_acc: 0.8300
Epoch 4/10
100/100 [==============================] - 0s 16us/step - loss: 0.3922 - acc: 0.8300 - val_loss: 0.3659 - val_acc: 0.8400
Epoch 5/10
100/100 [==============================] - 0s 17us/step - loss: 0.3659 - acc: 0.8400 - val_loss: 0.3483 - val_acc: 0.8500
Epoch 6/10
100/100 [==============================] - 0s 16us/step - loss: 0.3483 - acc: 0.8500 - val_loss: 0.3356 - val_acc: 0.8600
Epoch 7/10
100/100 [==============================] - 0s 17us/step - loss: 0.3356 - acc: 0.8600 - val_loss: 0.3260 - val_acc: 0.8600
Epoch 8/10
100/100 [==============================] - 0s 18us/step - loss: 0.3260 - acc: 0.8600 - val_loss: 0.3186 - val_acc: 0.8600
Epoch 9/10
100/100 [==============================] - 0s 18us/step - loss: 0.3186 - acc: 0.8600 - val_loss: 0.3127 - val_acc: 0.8700
Epoch 10/10
100/100 [==============================] - 0s 23us/step - loss: 0.3127 - acc: 0.8700 - val_loss: 0.3079 - val_acc: 0.8800
结果表明val_loss和loss在每个epoch结束时不一样,acc和val_acc 并不完全相同。但是,基于此设置,人们会期望它们是相同的。
我一直在浏览 keras 中的代码,尤其是这部分: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/engine/training.py#L1364
到目前为止,我只能说差异是由于通过计算图进行的一些不同的计算。
有人知道为什么会有这样的差异吗?
【问题讨论】:
标签: python tensorflow machine-learning keras deep-learning