使用Tensorflow进行多任务深度学习

时间:2016-01-04 12:28:49

标签: tensorflow deep-learning

有人尝试使用TensorFlow进行多任务深度学习吗?也就是说,共享底层而不共享顶层。一个简单插图的例子会有很大帮助。

1 个答案:

答案 0 :(得分:8)

有一个类似的问题here,答案使用了keras。

仅使用tensorflow时类似。我们的想法是:我们可以定义网络的多个输出,从而定义多个损失函数(目标)。然后我们告诉优化器最小化组合损失函数,通常使用线性组合。

概念图Multi Task Deep Learning Diagram

此图表是根据此paper绘制的。

我们假设我们正在训练一个预测图像中数字的分类器,每张图像最多5位数。这里我们定义了6个输出层:digit1digit2digit3digit4digit5length。如果有这样的数字,digit图层应该输出0~9,如果没有任何数字,X在实践中用实数替换它)数字在其位置length的情况相同,如果图像包含0~5位,则输出0~5;如果包含5位以上,则输出X

现在训练它,我们只是加上每个softmax函数的所有交叉熵损失:

# Define loss and optimizer
lossLength = tf.log(tf.clip_by_value(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(length_logits, true_length)), 1e-37, 1e+37))
lossDigit1 = tf.log(tf.clip_by_value(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(digit1_logits, true_digit1)), 1e-37, 1e+37))
lossDigit2 = tf.log(tf.clip_by_value(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(digit2_logits, true_digit2)), 1e-37, 1e+37))
lossDigit3 = tf.log(tf.clip_by_value(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(digit3_logits, true_digit3)), 1e-37, 1e+37))
lossDigit4 = tf.log(tf.clip_by_value(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(digit4_logits, true_digit4)), 1e-37, 1e+37))
lossDigit5 = tf.log(tf.clip_by_value(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(digit5_logits, true_digit5)), 1e-37, 1e+37))

cost = tf.add(
        tf.add(
        tf.add(
        tf.add(
        tf.add(cL,lossDigit1),
        lossDigit2),
        lossDigit3),
        lossDigit4),
        lossDigit5)

optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)