假设我有两个神经网络模型,每个模型都有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
答案 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]]})