Jupyter Notebook重启后模型训练恢复与微调流程咨询
大型模型跨Jupyter会话恢复训练的疑问与验证
核心疑问
- 重启Jupyter Notebook后重新执行模型定义代码,之前训练得到的权重会被覆盖吗?即便EarlyStopping曾恢复最优权重,重启后执行代码也会重置吗?
- 手动加载Checkpoint进行模型微调的流程是否正确?
- 是否必须保持Jupyter持续打开才能保留模型变量?
用户提供的模型定义代码
# Define ResNet50 base model with weights from imagenet. Do NOT include top classification layers. base_model = tf.keras.applications.resnet_v2.ResNet50V2(input_shape=input_shape, include_top=False, weights='imagenet') # Freeze base model base_model.trainable = False # Define input layer inputs = tf.keras.Input(shape=input_shape) # Apply Data Augmentation x = data_augmentation(inputs) # Preproccess input using the same weights base model was trained on x = tf.keras.applications.resnet_v2.preprocess_input(x) # Set training = False to disable Batch Norm layers from updating x = base_model(x, training = False) # Add avaragePooling x = tfl.GlobalAveragePooling2D()(x) # Add dropout layer for regularization x = tfl.Dropout(0.2)(x) # Add prediction/output layer with 3 neurons (Class Number = 3) outputs = tfl.Dense(3, kernel_initializer = HeNormal())(x) model = tf.keras.Model(inputs, outputs) base_lr = 0.004 model.compile(optimizer=Adam(learning_rate = base_lr), loss=CategoricalCrossentropy(from_logits = True), metrics=["accuracy"])
用户现有训练流程
- 定义数据集
- 定义带数据增强的模型,设置
base_model.trainable = false - 编译模型
- 定义EarlyStopping、Checkpoints、ReduceLR、tensorboard等回调
- 执行
model.fit
用户设想的微调恢复流程
# Load weights from the checkpoint with the lowest val_loss if model.get_weights() returns different weights model.load_weights(r'.\checkpoints\ResNet50\run_23_07_2022-13_18_57\ckp_24-0.4337')
之后设置base_model.trainable = True,重新编译并执行model.fit进行微调。
解答
关于权重重置的问题
重启Jupyter Notebook后,所有内存中的变量(包括模型权重、训练状态等)都会被完全释放。重新执行模型定义代码时,模型会被重新初始化:基础层加载Imagenet预训练权重,顶层则是HeNormal()初始化的随机权重,之前训练得到的权重(包括EarlyStopping恢复的最优权重)都会丢失,相当于回到训练前的初始状态。
手动加载Checkpoint的流程正确性验证
你的设想流程是可行的,但可以优化几个细节:
- 无需对比权重:重启后重新定义的模型必然是初始状态,直接加载最优Checkpoint即可,不用通过
model.get_weights()对比。 - 保证结构一致:必须确保重启后定义的模型结构(输入形状、层的数量/类型、初始化方式等)和训练时完全一致,否则
load_weights会报错。 - 微调的编译注意:设置
base_model.trainable = True后,必须重新编译模型,且建议使用更小的学习率(比如原学习率的1/10,即base_lr / 10),避免预训练权重被破坏。
是否需要保持Jupyter持续打开?
不需要。Jupyter关闭后内存中的模型状态会销毁,但只要你通过Checkpoint保存了权重文件,下次重启会话、重新定义相同结构的模型后,加载权重就能恢复到之前的训练状态,完全可以中断会话后再继续训练。
额外优化建议
- 保存完整模型:训练完成后可以用
model.save("path/to/your/model")保存整个模型(结构+权重+编译配置),下次直接用tf.keras.models.load_model("path/to/your/model")加载,无需重新定义模型结构,更高效。 - 自动保存最优Checkpoint:在Checkpoint回调中设置
save_best_only=True,这样只会保存验证集表现最好的权重,不用手动查找val_loss最低的文件。 - 分层解冻微调:微调时无需解冻所有层,可以只解冻ResNet的最后几个block(比如
base_model.trainable = True; fine_tune_at = 100; for layer in base_model.layers[:fine_tune_at]: layer.trainable = False),既能利用预训练权重,又能减少计算量、提升训练稳定性。
内容的提问来源于stack exchange,提问作者Marios Constantinou
相关产品推荐
相关产品推荐

