【问题标题】:Change training dataset every N epochs in Keras在 Keras 中每 N 个 epoch 更改一次训练数据集
【发布时间】:2018-03-27 10:34:40
【问题描述】:

我想在 Keras 中每隔 N epoch 传递另一个训练数据集 (X_train, y_train),其中 (X_train, y_train) 是通过蒙特卡洛模拟获得的。

在伪代码中,它会通过以下方式完成:

for i in range(nb_total_epochs):
    if i%N == 0:
       X_train, y_train = generate_new_dataset(simulation_parameters)
    train_model(X_train, y_train)

是否有任何现成的技巧可以通过fit() 函数实现这一点?

【问题讨论】:

  • 我认为你应该使用自定义生成器

标签: python deep-learning keras


【解决方案1】:

使用Sequence 创建您的数据集并将其传递给fit_generator。定义on_epoch_end 方法来修改特定时期的数据集。

每个Sequence 都必须实现__getitem____len__ 方法。 如果您想在 epoch 之间修改数据集,您可以实现 on_epoch_end 方法 __getitem__ 应该返回一个完整的批次。

此外,您可以安全地将Sequence 用于多处理数据处理:

keras.utils.Sequence 的使用保证了使用use_multiprocessing=True 时的顺序,并保证了每个 epoch 的每个输入的单一使用。

示例

Sequence 文档进行了轻微修改,以包含on_epoch_end

class CIFAR10Sequence(Sequence):

    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.epoch = 0
        self.batch_size = batch_size

    def __len__(self):
        return int(np.ceil(len(self.x) / float(self.batch_size)))

    def __getitem__(self, idx):
        batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
        batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]

        return np.array([
            resize(imread(file_name), (200, 200))
               for file_name in batch_x]), np.array(batch_y)

    def on_epoch_end(self):
        if self.epoch % N == 0:
            pass
            # modify data
        self.epoch += 1

【讨论】:

    猜你喜欢
    • 2018-10-12
    • 2019-10-04
    • 1970-01-01
    • 2020-10-17
    • 2020-05-05
    • 2018-07-27
    • 2016-12-31
    • 2018-04-02
    • 2022-01-19
    相关资源
    最近更新 更多