我有多任务学习的Tensorflow代码(一个输入,几个输出,类似于:https://jg8610.github.io/Multi-Task/)。有关进一步说明,请参阅下代码可以工作,但速度很慢,因为在Python中读取数据并将其提供给GPU(使用tf.Session的feed_dict
)会产生大量开销。
所以我现在的计划是根据https://www.tensorflow.org/programmers_guide/reading_data#preloaded_data [将其存储在tf.constant
并使用TF的排队系统]预加载数据。这引发了一些问题,其中现在最重要的是:
X_in
。这意味着在声明共享层时,我现在需要决定是将其连接到X_input_task_A
还是X_input_task_B
,显然这不会导致共享层。我的问题
您是否知道如何解决此问题,即使用特定于任务的张量定义共享层,然后通过在任务之间交替进行培训?您如何选择调用不同的优化器操作?
有关多任务学习范例的进一步说明
对于后台,所提及的博客文章(以及我目前为止的代码)所做的是定义占位符X_in
以及使用该输入操作的共享层。然后,对于我们想要学习的每个任务,我们使用不同的投影和损失函数,使用特定于任务的占位符y_task
,并通过交替运行session.run(optimizer_task, feed_dict={X_in: X_batch_task, y_task: y_batch_task})
进行培训,其中optimizer_task
是一项任务特定的优化器。这基本上就是我的代码现在所做的 - 它有效,但速度很慢,因为我需要提供数据:
# PLACEHOLDERS
X_in = tf.placeholder([batch_size, 100])
y_task_a = tf.placeholder([batch_size, 4]) # 4 output classes
y_task_b = tf.placeholder([batch_size, 2]) # 2 output classes
# SHARED LAYER
W = tf.get_variable("W", [100, 50])
shared_layer = tf.sigmoid(tf.matmul(X_in, W))
# TASK-SPECIFIC OUTPUTS
W_task_a = tf.get_variable("Wa", [50, 4])
W_task_b = tf.get_variable("Wb", [50, 2])
pred_task_a = tf.sigmoid(tf.matmul(shared_layer, W_task_a))
pred_task_b = tf.sigmoid(tf.matmul(shared_layer, W_task_b))
# TASK-SPECIFIC LOSSES AND OPTIMIZERS
loss_task_a = tf.nn.softmax_cross_entropy_with_logits(logits=pred_task_a, labels=y_task_a)
loss_task_b = tf.nn.softmax_cross_entropy_with_logits(logits=pred_task_b, labels=y_task_b)
optimizer_a = ...(loss_task_a)
optimizer_b = ...(loss_task_b)
# TRAINING
with tf.Session() as sess:
for i in range(ITERS):
# ALTERNATE BETWEEN TASKS, GET BATCH FROM DATA PER TASK AND TRAIN
X_a, y_a = data_task_a.get_batch()
X_b, y_b = data_task_b.get_batch()
sess.run(optimizer_a, feed_dict={X_in: X_a, y_task_a: y_a})
sess.run(optimizer_b, feed_dict={X_in: X_b, y_task_b: y_b})