gpt4 book ai didi

tensorflow - Keras:训练数据的自定义数据验证回调总是返回验证数据结果

转载 作者:行者123 更新时间:2023-12-05 06:09:45 28 4
gpt4 key购买 nike

我正在 Keras 中开发一个自动编码器,其中包含一些丢失层。为了评估偏差和方差,我想比较训练和测试数据的损失。但是,由于在训练过程中使用了 dropout,因此无法比较损失。 (请参阅 here 以了解为什么训练数据结果可能比测试数据结果差。)为了获得不受 dropout 影响的训练数据损失,我编写了一个回调来验证一些额外的数据集(在这种情况下,它将再次是训练数据)。奇怪的是,我总是得到与验证数据相同的结果。这是一个最小的例子:

from pprint import pprint

import keras
import numpy as np
import pandas as pd
from numpy.random import seed as np_seed
from tensorflow.random import set_seed as tf_seed

np_seed(1)
tf_seed(2)

# Generation of data sets for training and testing. Random data is only used to showcase the problem.
df_train = pd.DataFrame(data=np.random.random((1000, 10))) # This will be used for training
df_test_1 = pd.DataFrame(data=np.random.random((1000, 10))) # This will be used as validation data set directly
df_test_2 = pd.DataFrame(data=np.random.random((1000, 10))) # This will be used within the callback

np_seed(1)
tf_seed(2)

model = keras.models.Sequential(
[
keras.Input(shape=(10, )),
keras.layers.Dropout(rate=0.01),
keras.layers.Dense(5, activation='relu'),
keras.layers.Dropout(rate=0.01),
keras.layers.Dense(10, activation='linear'),
]
)

model.compile(
loss='mean_squared_error',
optimizer=keras.optimizers.Adam(),
)


class CustomDataValidation(keras.callbacks.Callback):
def __init__(self, x=None, y=None):
self.x = x
self.y = y

def on_epoch_end(self, epoch, logs=None):
result = self.model.evaluate(x=self.x, y=self.y, return_dict=True)

for loss_name, loss_value in result.items():
logs["custom_" + loss_name] = loss_value


cdv = CustomDataValidation(df_test_2, df_test_2)

hist = model.fit(df_train, df_train, validation_data=(df_test_1, df_test_1), epochs=2, validation_split=0.1, callbacks=[cdv])
pprint(hist.history)

输出是

Epoch 1/2
4/4 [==============================] - 0s 1ms/step - loss: 0.7625
29/29 [==============================] - 0s 5ms/step - loss: 0.9666 - val_loss: 0.7625
Epoch 2/2
4/4 [==============================] - 0s 1ms/step - loss: 0.5331
29/29 [==============================] - 0s 2ms/step - loss: 0.6638 - val_loss: 0.5331
{'custom_loss': [0.7624925374984741, 0.5331208109855652],
'loss': [0.9665887951850891, 0.6637843251228333],
'val_loss': [0.7624925374984741, 0.5331208109855652]}

'custom_loss' 和 'val_loss' 是相等的,尽管它们应该基于完全不同的数据集。因此,问题是:如何在回调中评估模型在自定义数据上的性能?

编辑:因为我还没有在 stackoverflow 上得到答案,所以我创建了一个 issue在 tensorflow 的 git 仓库中。另外,现在有一个 notebook可以显示问题。

最佳答案

这似乎是 tensorflow 版本 2.3.x 中的一个错误(用 2.3.0 和 2.3.1 测试过)。在版本 2.4.0-rc0 和 2.2.1 中,losscustom_loss 的损失输出不同,这是预期的行为:

{'custom_loss': [0.7694963216781616, 0.541864812374115],
'loss': [0.9665887951850891, 0.6637843251228333],
'val_loss': [0.7624925374984741, 0.5331208109855652]}

关于tensorflow - Keras:训练数据的自定义数据验证回调总是返回验证数据结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64645579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com