Skip to main content
 首页 » 编程设计

python之TensorFlow:使用不同的损失函数恢复训练

2025年01月19日31pander-it

这个问题与 this one 具有相似的精神,但我根本无法让它工作,所以我需要一些帮助...

目标:使用具有相当粗略的损失​​函数的 TensorFlow 预训练网络,以便所有权重/偏差都在正确的范围内。然后,继续使用更复杂的损失函数进行训练以微调模型。

尝试的方法:在预训练阶段之后,保存模型(使用tf.train.Saver()),然后立即重新加载变量并更改损失函数。下面我添加了一个简约的非工作示例:

# Crude loss function 
loss_fn_1 = tf.reduce_mean(tf.losses.huber_loss(labels=box_in, predictions=box_out), name="loss") 
 
# Less crude loss function 
loss_fn_2 = tf.reduce_mean(model.IOU_loss(box_in, box_out), name="IOU_loss") 
 
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss_fn_1) 
saver = tf.train.Saver() 
 
# First round of training 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    # Train hard, fight easy 
    saver.save(sess, savefile) 
 
# Second round of training 
with tf.Session() as sess: 
 
    saver = tf.train.import_meta_graph(savefile_meta) 
    saver.restore(sess, tf.train.latest_checkpoint(savedir)) 
 
    graph = tf.get_default_graph() 
    IOU_loss = graph.get_tensor_by_name("IOU_loss:0") 
 
    train_step = tf.train.AdamOptimizer(1e-4).minimize(IOU_loss) 
 
    # 'Eye of the tiger'-type of training 

我尝试了在重新启动 tf.Session() 之前或之后重新定义 train_step 以及加载/重命名各种其他变量的各种组合。主要问题是我对自己在做什么或错误的真正含义一无所知,而且我的随机游走并没有带我到任何地方。

请您参考如下方法:

在随机游走一段时间后,我发现了以下对我有用的解决方案:您可以简单地定义第二个优化函数 - 请参见下面的示例

# Crude loss function 
loss_fn_1 = tf.reduce_mean(tf.losses.huber_loss(labels=box_in, predictions=box_out), name="loss") 
 
# Less crude loss function 
loss_fn_2 = tf.reduce_mean(model.IOU_loss(box_in, box_out), name="IOU_loss") 
 
trainer1 = tf.train.AdamOptimizer(1e-4).minimize(loss_fn_1) 
trainer2 = tf.train.AdamOptimizer(1e-4).minimize(loss_fn_2) 
 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
 
    # First round of training 
    for i in range(100): 
        trainer1.run() 
 
    # Second round of training 
    for i in range(1000): 
        trainer2.run() 

如果您觉得其他解决方案更可取,请发表评论/回答。