Тензор потока: изменение активаций, влияющих на обратное распространение - PullRequest
1 голос
/ 29 марта 2019

Есть ли способ в Tensorflow, чтобы я мог изменить активации скрытого узла на другое значение во время обратного распространения? То есть предположим, что узел в слое вывел значение 'a1' во время прямого распространения. Затем во время обратного распространения, когда обновление градиентов достигнет этого узла, я хочу, чтобы оно использовало другое значение в качестве активации (скажем, «a2»), чтобы весь процесс обратного распространения происходил так, как это было «a2» во время прямого распространения.

Я знаю, что мы можем создавать / изменять собственные градиенты, но здесь мне нужно заменить значение активации скрытого узла во время backprop.

1 Ответ

0 голосов
/ 30 марта 2019

Это может быть достигнуто несколькими способами.Самый простой способ - использовать tf.cond() с логическим заполнителем, для которого вы будете вводить различные значения (True, False) во время прямого и обратного проходов.В следующем примере используется 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
...