调用 fit() 是不是应该保持模型的权重?

Posted

技术标签:

【中文标题】调用 fit() 是不是应该保持模型的权重?【英文标题】:Is calling fit() supposed to keep the model's weights?调用 fit() 是否应该保持模型的权重? 【发布时间】:2022-01-21 04:22:15 【问题描述】:

目前,我正在使用一个自定义生成器,它不是作为类编写的,而是作为函数编写的。要重置我的生成器并将其内容重新洗牌,我只需要再次调用它。

所以,为了训练新的纪元,我在重启我的生成器后调用model.fit()

batches = 32
split_ratio = 0.8
epochs = 10
for i in range(epochs):
    train_set = dataset_generator(clean_path, noisy_path, denoised_path, noise_data, batch_size=batches, shuffle=True, 
                                  partition="training", split=True, split_size=split_ratio, seed= batches+i, 
                                  image_dimension = [256,256,3])
    valid_set = dataset_generator(clean_path, noisy_path, denoised_path, noise_data, batch_size=batches, shuffle=True, 
                                  partition="validation", split=True, split_size=split_ratio, seed= batches+i, 
                                  image_dimension = [256,256,3])
    model.fit(train_set, validation_data=valid_set, batch_size=batches, verbose=1, )
    model.save("./model_run" + str(i) + ".h5")

问题是:训练从准确度 0 开始,就像是从头开始训练一样。一个纪元结束和另一个纪元开始的 keras 输出:

#1st epoch:
757/Unknown - 754s 996ms/step - loss: 1.7376 - accuracy: 0.8544

#2nd epoch:
2/Unknown - 2s 919ms/step - loss: 1.5388 - accuracy: 0.6328

fit() 不应该保留权重吗?这里发生了什么?

【问题讨论】:

【参考方案1】:

您可以自定义 fit() 方法:https://www.tensorflow.org/guide/keras/customizing_what_happens_in_fit/

但我认为您不应该生成数据集并拟合每个时期。

您需要为您的 TensorFlow 模型定义自己的训练循环。我曾经在我的估算器上调用过 train(input_fn=) 。 train 和 input_fn 方法包含用于训练的数据集解包和迭代。我在https://www.tensorflow.org/api_docs/python/tf/estimator/train_and_evaluate找到了一个例子

【讨论】:

以上是关于调用 fit() 是不是应该保持模型的权重?的主要内容,如果未能解决你的问题,请参考以下文章

是否再次调用 model.fit 方法重新初始化已经训练的权重?

在同一个模型上多次调用 fit() 有啥作用?

样本权重如何在分类模型中发挥作用?

调用 XGBoost .fit 后的 Python sklearn NotFittedError

keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重

模型是不是应该调用服务来获取数据