Это может быть достигнуто несколькими способами.Самый простой способ - использовать 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