gpt4 book ai didi

validation - 将多个验证集与keras一起使用

转载 作者:行者123 更新时间:2023-12-04 00:43:44 29 4
gpt4 key购买 nike

我正在使用model.fit()方法使用keras训练模型。
我想使用多个验证集,这些验证集应在每个训练时期之后分别进行验证,以便为每个验证集获得一个损失值。如果可能的话,它们既应在培训期间显示,又应由keras.callbacks.History()回调返回。

我在想这样的事情:

history = model.fit(train_data, train_targets,
epochs=epochs,
batch_size=batch_size,
validation_data=[
(validation_data1, validation_targets1),
(validation_data2, validation_targets2)],
shuffle=True)


我目前不知道该如何实现。是否可以通过编写自己的 Callback来实现?或者您将如何解决这个问题?

最佳答案

我最终基于Callback回调编写了自己的History来解决问题。我不确定这是否是最好的方法,但是以下Callback记录了训练和验证集(如History回调)的损失和指标以及传递给构造函数的其他验证集的损失和指标。

class AdditionalValidationSets(Callback):
def __init__(self, validation_sets, verbose=0, batch_size=None):
"""
:param validation_sets:
a list of 3-tuples (validation_data, validation_targets, validation_set_name)
or 4-tuples (validation_data, validation_targets, sample_weights, validation_set_name)
:param verbose:
verbosity mode, 1 or 0
:param batch_size:
batch size to be used when evaluating on the additional datasets
"""
super(AdditionalValidationSets, self).__init__()
self.validation_sets = validation_sets
for validation_set in self.validation_sets:
if len(validation_set) not in [2, 3]:
raise ValueError()
self.epoch = []
self.history = {}
self.verbose = verbose
self.batch_size = batch_size

def on_train_begin(self, logs=None):
self.epoch = []
self.history = {}

def on_epoch_end(self, epoch, logs=None):
logs = logs or {}
self.epoch.append(epoch)

# record the same values as History() as well
for k, v in logs.items():
self.history.setdefault(k, []).append(v)

# evaluate on the additional validation sets
for validation_set in self.validation_sets:
if len(validation_set) == 3:
validation_data, validation_targets, validation_set_name = validation_set
sample_weights = None
elif len(validation_set) == 4:
validation_data, validation_targets, sample_weights, validation_set_name = validation_set
else:
raise ValueError()

results = self.model.evaluate(x=validation_data,
y=validation_targets,
verbose=self.verbose,
sample_weight=sample_weights,
batch_size=self.batch_size)

for i, result in enumerate(results):
if i == 0:
valuename = validation_set_name + '_loss'
else:
valuename = validation_set_name + '_' + self.model.metrics[i-1].__name__
self.history.setdefault(valuename, []).append(result)


然后我这样使用:

history = AdditionalValidationSets([(validation_data2, validation_targets2, 'val2')])
model.fit(train_data, train_targets,
epochs=epochs,
batch_size=batch_size,
validation_data=(validation_data1, validation_targets1),
callbacks=[history]
shuffle=True)

关于validation - 将多个验证集与keras一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47731935/

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