使用共享层

时间:2017-03-30 22:07:46

标签: python tensorflow deep-learning

我有多任务学习的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})

0 个答案:

没有答案
相关问题