如何复制操作&占位符在Tensorflow中

时间:2016-06-11 05:34:07

标签: tensorflow

假设我有两个神经网络模型,每个模型都有1个输入占位符和1个输出张量。从这两个输出中我需要3个单独的值。

inputs: i1, i2, outputs: o1, o2
a = 1
b = 2

v1 = session.run(o1, feed_dict={i1: a})
v2 = session.run(o1, feed_dict={i1: b})
v3 = session.run(o2, feed_dict={i2: a})

问题是我需要将这3个值输入到损失函数中,所以我不能这样做。我需要做

loss = session.run(L, feed_dict={i1: a, i1: b, i2:a })

我不认为我能做到这一点,但即使我能在以后的操作中仍然存在歧义,因为输入i1的o1与输入i2的o1的使用方式不同。

我认为可以通过在第一个神经网络中使用2个输入占位符和2个输出来解决。所以鉴于我已经有一个模型,有没有办法重组输入和输出,以便我可以容纳这个?

视觉上我想转

i1 ---- (model) ----- o1 

i1a                          o1a
  \                         /
   \                       /
    x ----- (model) ----- x        
   /                       \
  /                         \
i1b                          o1b

1 个答案:

答案 0 :(得分:2)

你的直觉是对的,你必须为你的网络1创建2个不同的占位符i1a和i1b,有两个输出o1a和o1b。你的视觉效果看起来很棒所以这是我的主张:

i1a  ----- (model) -----  o1a
              |            
        shared weights                                  
              |            
i1b  ----- (model) -----  o1b

这样做的正确方法是使用tf.get_variable()reuse=True的每个变量复制您的网络。

def create_variables():
  with tf.variable_scope('model'):
    w1 = tf.get_variable('w1', [1, 2])
    b1 = tf.get_variable('b1', [2])

def inference(input):
  with tf.variable_scope('model', reuse=True):
    w1 = tf.get_variable('w1')
    b1 = tf.get_variable('b1')
    output = tf.matmul(input, w1) + b1
  return output

create_variables()

i1a = tf.placeholder(tf.float32, [3, 1])
o1a = inference(i1a)

i1b = tf.placeholder(tf.float32, [3, 1])
o1b = inference(i1b)

loss = tf.reduce_mean(o1a - o1b)


with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  sess.run(loss, feed_dict={i1a: [[0.], [1.], [2.]], i1b: [[0.5], [1.5], [2.5]]})