stop_gradient в тензорном потоке - PullRequest
0 голосов
/ 07 мая 2018

Мне интересно, останавливает ли 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)

1 Ответ

0 голосов
/ 08 мая 2018

Остановка градиента предотвратит продолжение обратного распространения за этим узлом на графике. Ваш код не имеет пути от weights_i к потере, кроме того, который проходит через weights_fx_t, где градиент останавливается. Именно поэтому weights_i не обновляется во время тренировки. Вам не нужно ставить stop_gradient после каждого шага. Использование этого только один раз остановит обратное распространение там.

Если stop_gradient не делает то, что вы хотите, вы можете получить градиенты, выполнив tf.gradients, и вы можете написать свою собственную операцию обновления, используя tf.assign. Это позволит вам изменять градиенты так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...