代码之家  ›  专栏  ›  技术社区  ›  TheNobleSix

凯拉斯恢复新建筑的训练

  •  0
  • TheNobleSix  · 技术社区  · 7 年前

    使用MNIST数据集,在本例中,我将模型训练2个阶段,然后将模型保存到 .h5 文件。然后重新加载模型,修改模型并重新编译。但我想重新开始训练。所以我想使用重新加载的模型的优化器来继续培训。代码如下:

    MLP = keras.models.Sequential([
            keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)),
            keras.layers.Dense(10, activation='softmax')
        ])
    MLP.compile(optimizer=tf.keras.optimizers.Adam(lr=0.5), loss=tf.losses.log_loss, metrics=['accuracy'])
    training_output = MLP.fit(x_train, y_train, epochs=2, validation_data=(x_val, y_val), verbose=2, initial_epoch=0)
    
    MLP.save('test.h5')
    
    
    
    MLP = keras.models.load_model('test.h5', custom_objects={'log_loss': log_loss})
    modelt = MLP
    modelt = # update modelt architecture
    
    
    modelt.compile(optimizer=MLP.optimizer, loss=tf.losses.log_loss, metrics=['accuracy'])
    training_output = modelt.fit(x_train, y_train, epochs=4, validation_data=(x_val, y_val), verbose=2, initial_epoch=2)
    

    Epoch 1/2
    
     - 1s - loss: 1.2690 - acc: 0.2216 - val_loss: 1.3097 - val_acc: 0.2095
    
    Epoch 2/2
    
     - 1s - loss: 1.2859 - acc: 0.2030 - val_loss: 1.2420 - val_acc: 0.1760
    
    Epoch 3/4
    
     - 1s - loss: 2.8945 - acc: 0.0993 - val_loss: 2.9367 - val_acc: 0.0890
    
    Epoch 4/4
    
     - 1s - loss: 2.9035 - acc: 0.0993 - val_loss: 2.9367 - val_acc: 0.0890
    

    编辑: 模型的简单保存和重新加载将返回以下结果:

    lr begin: 0.15811755
    begin: [0.35258077597618104, 0.1265]
    lr end: 0.25961164
    end: [1.0754492826461792, 0.2785]
    -------------------------------------------------------------
    lr begin: 0.25961164
    begin: [1.0754492826461792, 0.2785]
    lr end: 0.34131044
    end: [1.5968322057723998, 0.2185]
    -------------------------------------------------------------
    lr begin: 0.34131044
    begin: [1.5968322057723998, 0.2185]
    lr end: 0.3903688
    end: [2.8819153175354004, 0.106]
    -------------------------------------------------------------
    lr begin: 0.3903688
    begin: [2.8819153175354004, 0.106]
    lr end: 0.42264876
    end: [2.8819153175354004, 0.106]
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Hemerson Tacon    7 年前

    我进入聊天室和@TheNobleSix讨论这个问题,并在那里找到了答案,但他没有在那里给我反馈。所以,我写这篇文章是为了帮助其他用户解决类似的问题。


    重新加载模型时,您 不应重新编译模型 如中所述 Keras documentation ! 这会导致优化器失去其先前的状态。这就是当你试图按照评论中的建议单独完成任务的每一部分时所发生的事情。

    考虑到这一点,根据您希望在模型中进行的修改,可能不适合在同一点继续训练,或者很难根据相同的损失/准确度值调整更新的模型以继续训练。参数数目的改变会导致目标函数的急剧变化。例如,如果更改一个层中的神经元数量或添加一个新层,则需要初始化新的神经元。一个可能的解决办法是在神经元之间重新分配层的重量(如果是第一种情况)。其结果是,该层已经识别的可能模式丢失。

    我知道前一段很投机。如果您描述您在体系结构中所做的具体修改,我可以尝试为您提供关于模型更新部分的更精确的答案。