有人尝试使用TensorFlow进行多任务深度学习吗?也就是说,共享底层而不共享顶层.一个简单插图的例子会有很大帮助.
有一个类似的问题在这里,答案使用keras.
只使用tensorflow时类似.我们的想法是:我们可以定义网络的多个输出,从而定义多个损失函数(目标).然后我们告诉优化器最小化组合损失函数,通常使用线性组合.
概念图
该图是根据本文绘制的.
假设我们正在训练一个预测图像中数字的分类器,每个图像最多5位数.在这里,我们定义6输出层:digit1
,digit2
,digit3
,digit4
,digit5
,length
.该digit
层应该输出0〜9,如果有这样的位,或X
(在实践中的实数代替它),如果没有任何数字在其位置上.同样的事情length
,如果图像包含0~5位数,或者X
包含5位以上的数字,则输出0~5 .
现在要训练它,我们只是加上每个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)