这个问题与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
我尝试了在重新启动train_step
之前或之后重新定义tf.Session()
的各种组合,以及加载/重命名各种其他变量。主要的问题是,我对我正在做的事情一无所知,或者错误的真正含义,而且我的随机行走并没有把我带到任何地方。
答案 0 :(得分:1)
随机走了一段时间后,我发现以下解决方案对我有用:你可以简单地定义第二个优化功能 - 见下面的例子
# 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()
如果您认为其他解决方案更可取,请发表评论/回答。