如果我有两个神经网络A和B,我使用网络A的输出来馈送网络B的输入(占位符)。我使用优化器来最小化网络B的丢失,可以网络A&# 39; s参数可以通过反向传播来更新吗?
答案 0 :(得分:1)
是的,如果在TensorFlow中完成“feed”;不,如果你手动完成。
具体来说,如果您评估A,那么训练B并将这些输出手动输入(例如,作为饲料字典),A不会改变,因为它不参与训练阶段。
如果将B网络的输入设置为A中的op输出(例如,而不是tf.Placeholder),则可以训练组合网络,这将更新A的参数。但在这种情况下,你真的只是在训练一个组合网络“AB”,而不是两个独立的网络。
一个具体的例子:
import numpy as np
import tensorflow as tf
# A network
A_input = tf.placeholder(tf.float32, [None,100])
A_weights = tf.Variable(tf.random_normal([100,10]))
A_output = tf.matmul(A_input,A_weights)
# B network
B_input = tf.placeholder(tf.float32, [None,10])
B_weights = tf.Variable(tf.random_normal([10,5]))
B_output = tf.matmul(B_input,B_weights)
# AB network
AB_input = A_output
AB_weights = tf.Variable(tf.random_normal([10,5]))
AB_output = tf.matmul(AB_input,AB_weights)
test_inputs = np.random.rand(17,100)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
A_out = sess.run(A_output, feed_dict={A_input: test_inputs})
print 'A output shape:',A_out.shape
B_out = sess.run(B_output, feed_dict={B_input: A_out})
print 'B output shape:',B_out.shape
AB_out = sess.run(AB_output, feed_dict={A_input: test_inputs})
print 'AB output shape:',AB_out.shape
在第一种情况下,我们使用feed_dict为网络B提供网络A的输出。这是在tensorflow中评估网络A,将结果拉回到python中,然后在tensorflow中评估网络B.如果您尝试以这种方式训练网络B,则只会更新网络B中的参数。
在第二种情况下,我们通过将网络A的输出直接连接到网络AB的输入来馈送网络AB的“B”部分。评估网络AB从不将网络A的中间结果拉回到python中,因此如果以这种方式训练网络AB,则可以更新组合网络的参数。 (注意:您的训练输入是输入到网络AB的A_input,而不是中间张量AB_input)