Мне интересно, останавливает ли tf.stop_gradient вычисление градиента только для данной операции или останавливает обновление входных данных tf.variable? У меня есть следующая проблема: во время вычисления прямого пути в MNIST я хотел бы выполнить набор операций над весами (скажем, от W до W *), а затем сделать математику с входными данными. Однако я хотел бы исключить эти операции из обратного пути. Я хочу, чтобы только dE / dW вычислялись во время тренировки с обратным распространением Код, который я написал, препятствует обновлению W. Не могли бы вы помочь мне понять, почему? Если бы это были переменные, я понимаю, что я должен установить их обучаемое свойство в false, но это операции с весами. Если stop_gradient не может быть использован для этой цели, то как мне построить два графика, один для прямого пути, а другой для обратного распространения?
def build_layer(inputs, fmap, nscope,layer_size1,layer_size2, faulty_training):
with tf.name_scope(nscope):
if (faulty_training):
## trainable weight
weights_i = tf.Variable(tf.truncated_normal([layer_size1, layer_size2],stddev=1.0 / math.sqrt(float(layer_size1))),name='weights_i')
## Operations on weight whose gradient should not be computed during backpropagation
weights_fx_t = tf.multiply(268435456.0,weights_i)
weight_fx_t = tf.stop_gradient(weights_fx_t)
weights_fx = tf.cast(weights_fx_t,tf.int32)
weight_fx = tf.stop_gradient(weights_fx)
weights_fx_fault = tf.bitwise.bitwise_xor(weights_fx,fmap)
weight_fx_fault = tf.stop_gradient(weights_fx_fault)
weights_fl = tf.cast(weights_fx_fault, tf.float32)
weight_fl = tf.stop_gradient(weights_fl)
weights = tf.stop_gradient(tf.multiply((1.0/268435456.0),weights_fl))
##### end transformation
else:
weights = tf.Variable(tf.truncated_normal([layer_size1, layer_size2],stddev=1.0 / math.sqrt(float(layer_size1))),name='weights')
biases = tf.Variable(tf.zeros([layer_size2]), name='biases')
hidden = tf.nn.relu(tf.matmul(inputs, weights) + biases)
return weights,hidden
Я использую оптимизатор тензорного градиентного спуска для обучения.
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)