Я пытался лучше понять последовательность поездов / проверок в цикле 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)
Обратите внимание, что я указал данные x
и цели y
как для обучения, так и для validation_data
. Кроме того, размер 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 и убыток не совпадают в конце каждой эпохи, а также acc и val_acc не совсем то же самое. Однако, исходя из этой настройки, можно ожидать, что они будут такими же.
Я просматривал код в keras, особенно эту часть:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/keras/engine/training.py#L1364
и до сих пор все, что я могу сказать, это различие из-за некоторых других вычислений через граф вычислений.
Кто-нибудь знает, почему будет такая разница?