2016-06-11 51 views
1

假設我有兩個神經網絡模型,每個模型具有1個輸入佔位符和1個輸出張量。從這2個輸出我需要3個不同的值。如何在Tensorflow中複製操作和佔位符

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

你的直覺是正確的,你必須創建2名不同的佔位符I1A和I1B爲您的網絡1,具有兩個輸出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]]})