Tensorflow:更改会影响反向传播的激活

时间:2019-03-29 14:05:00

标签: tensorflow backpropagation

Tensorflow中是否有一种方法可以在反向传播期间将隐藏节点的激活更改为其他值?即,假设层中的节点在正向传播期间输出了值“ a1”。然后在反向传播期间,当梯度更新到达此节点时,我希望它使用不同的值作为激活值(例如“ a2”),以便整个反向传播过程将像正向传播期间那样是“ a2”。

我知道我们可以创建/修改自定义渐变,但是在这里我需要在反向传播期间替换隐藏节点激活的值。

1 个答案:

答案 0 :(得分:0)

可以通过多种方式实现。最简单的方法是将tf.cond()与布尔占位符一起使用,在向前和向后传递过程中,您将为布尔占位符提供不同的值(TrueFalse)。以下示例在前向传播期间使用tf.nn.relu(),在反向传播期间使用tf.nn.sigmoid()

import tensorflow as tf
import numpy as np

x_train = np.array([[-1.551, -1.469], [1.022, 1.664]], dtype=np.float32)
y_train = np.array([1, 0], dtype=int)

x = tf.placeholder(tf.float32, shape=[None, 2])
y = tf.placeholder(tf.int32, shape=[None])

with tf.name_scope('network'):
    fc1 = tf.layers.dense(x, units=2)

    # `isforward` is a placeholder that defines what activation
    # are you going to use. If `True` `tf.nn.relu` is used.
    # Otherwise, `tf.nn.sigmoid` is used. 
    isforward = tf.placeholder_with_default(True, shape=())

    activation = tf.cond(isforward,
                         true_fn=lambda: tf.nn.relu(fc1), # forward pass
                         false_fn=lambda: tf.nn.sigmoid(fc1)) # backprop
    logits = tf.layers.dense(activation, units=2)

with tf.name_scope('loss'):
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
    loss_fn = tf.reduce_mean(xentropy)

with tf.name_scope('optimizer'):
    optimizer = tf.train.GradientDescentOptimizer(loss_fn)
    train_op = optimizer.minimize(loss_fn)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    loss_val = sess.run(loss_fn, feed_dict={x:x_train,
                                            y:y_train,
                                            isforward:True}) # forward
    _ = sess.run(train_op, feed_dict={x:x_train,
                                      y:y_train,
                                      isforward:False}) # backward