【发布时间】:2021-10-25 15:46:20
【问题描述】:
在我的损失低于某个值后,我使用回调来停止训练。训练结束后,我在训练输入上调用predict() 方法,但是,当我手动计算损失函数时,我得到了一个安静的糟糕结果。使用predict() 错了吗?还是我做错了什么?
import numpy as np
import random
import tensorflow as tf
from sklearn.metrics import mean_squared_error as my_mse
class stopAtLossValue(tf.keras.callbacks.Callback):
def on_epoch_end(self, batch, logs={}):
eps = 0.00001
if logs.get('loss') <= eps:
self.model.stop_training = True
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(x.shape[1],)),
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.Dense(1)
])
model.compile(loss='mse',optimizer = tf.keras.optimizers.Adam(learning_rate=0.001))
model.fit(x, y, epochs=1000, batch_size=1, verbose=1, callbacks=[stopAtLossValue()])
例如,当我运行代码 sn-p 时,我在 112 个 epoch 后达到了期望的损失值。
Epoch 111/1000
20/20 [==============================] - 0s 2ms/step - loss: 0.0294
Epoch 112/1000
20/20 [==============================] - 0s 315us/step - loss: 1.0666e-06
<keras.callbacks.History at 0x153a7b70d30>
然后,我调用predict() 方法并自己计算损失。顺便说一句,我的损失函数只是一个普通的最小平方误差(MSE)。我得到的价值相当高。事实上,如果我打印预测,即使 tf 由于 MSE 低而停止了训练,它们似乎也很糟糕。
my_mse(y,model.predict(x))
0.027716089
【问题讨论】:
标签: python tensorflow machine-learning keras deep-learning