【问题标题】:Using predict() method after the training process is completed in TensorFlow在 TensorFlow 中完成训练过程后使用 predict() 方法
【发布时间】: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


    【解决方案1】:

    不同之处是因为训练时显示的损失是每批次损失的平均值,但是对于每个批次都有一个梯度更新,因此在此期间模型权重在变化,因此您不会得到相同的损失值与使用 predict 进行评估一样,因为如果使用 predict,权重是固定的。

    所以最后,这些数字是不可比较的,因为它们的计算方式不同。

    【讨论】:

    • 那么,我做错了吗?我问这个的原因是预测性能明显下降。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2018-12-02
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2017-10-22
    • 2018-08-13
    相关资源
    最近更新 更多