【问题标题】:How do I train a model using two loss functions?如何使用两个损失函数训练模型?
【发布时间】:2018-06-21 21:13:12
【问题描述】:

我有一个带有两个损失函数的 TensorFlow 图。我想交替训练我的模型:

  1. 使用第一个损失函数训练模型。
  2. 使用第二个损失函数训练模型。
  3. 重复一二直到收敛。

我是否必须创建两个图表,然后为每一步加载、训练和保存权重?或者是否有可能用一张图来实现?

【问题讨论】:

  • 我认为说明为什么要实现这样的事情可能很有用:为什么要使用两个损失函数?
  • 我正在研究深度聚类,我正在为一个研究项目尝试不同的想法。一般来说,我们需要一个聚类和一个重建损失函数。

标签: python tensorflow


【解决方案1】:

是的,这是可能的:

import tensorflow as tf

x = tf.get_variable('x', initializer=42.)
y = tf.square(x)

optimizer = tf.train.GradientDescentOptimizer(0.1)

train_min = optimizer.minimize(y)  # minimize x*x
train_max = optimizer.minimize(-y) # maximize x*x

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for _ in range(20):
        cost, _ = sess.run([y, train_min])
        print(cost)
        cost, _ = sess.run([y, train_max])
        print(cost)

如果您不介意在完全同一批次上最小化两个成本函数,您甚至可以编写

import tensorflow as tf

x = tf.get_variable('x', initializer=42.)
y = tf.square(x)

optimizer = tf.train.GradientDescentOptimizer(0.1)

train_min = optimizer.minimize(y)

with tf.control_dependencies([train_min]):
    train_min_then_max = optimizer.minimize(-y)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for _ in range(20):
        cost, _ = sess.run([y, train_min_then_max])
        print(cost)

通过单个 sess.run 调用进行优化。

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2020-08-26
    • 2016-08-28
    • 2020-04-06
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多