我希望稍后根据两个神经元输出的梯度更新 trainable_variables
,如下所示:
X = tf.placeholder(dtype=tf.float32, shape=(None, 5), name='X')
with tf.name_scope('DNN') as scope:
hidden1 = tf.layers.dense(X, 4, name= 'hidden1', activation= tf.nn.relu )
output = tf.layers.dense(hidden1, 2, activation= None ,name = 'outs')
再次注意,输出层有2个神经元 . 但是,为了更新权重,我将选择其中一个神经元并采用渐变 . 第一个问题:我不确定是否可以使用 minimize
或 compute_gradients
加 apply_gradients
来实现同样的效果,因为它们需要一个仅输出一个变量的损失函数 . 它是否正确?我将使用变量 act
执行此操作,我将在运行步骤中更新:
act = tf.Variable(1, dtype = tf.int32, name='act', trainable=False)
with tf.name_scope('grads') as scope:
optimizer = tf.train.GradientDescentOptimizer(0.01)
以下是我如何选择输出变量来获取渐变:
grads_and_vars = optimizer.compute_gradients(output[0][act])
new_grads = [(grad*1000, var) for grad,var in grads_and_vars]
最后,我更新了trainable_variables:
training_op = [tf.assign(train_var, grad[0]) for train_var, grad in zip(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES), new_grads)]
第二个问题 . 这是更新图表中可训练权重的正确方法吗?
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
sess.run(train_op, feed_dict = {X : np.array([11,20,45,20,40]).reshape(1,5), act: np.random.choice([0,1],p = [0.4,0.6])
第三个问题:这个程序有意义吗?或者这是Tensorflow的不当使用?