Отрегулируйте количество сэмплов в Tensorflow nce_loss во время тренировки - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы настроить частоту дискретизации во время обучения моей нейронной сети, чтобы протестировать некоторые вещи и посмотреть, что произойдет. Чтобы достичь этого, моя идея заключалась в создании новых потерь и оптимизатора для каждой итерации с использованием одного и того же графика вычислений.

def optimize(self, negative_sampling_rate):
    return tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.calc_loss(negative_sampling_rate))

def calc_loss(self, negative_sampling_rate):
    return tf.reduce_mean(tf.nn.nce_loss(
        weights=self.graph.prediction_weights,
        biases=self.graph.prediction_bias,
        labels=self.graph.labels,
        inputs=self.graph.hidden,
        num_sampled=negative_sampling_rate,
        num_classes=self.graph.prediction_weights.shape[1])
    )

def train(self, batch_inputs, batch_labels, negative_sampling_rate):
    feed_dict = {self.graph.X: batch_inputs, self.graph.labels: batch_labels}
    _, loss_val = self.session.run(
        [self.optimize(negative_sampling_rate), self.calc_loss(negative_sampling_rate)], feed_dict=feed_dict
    )
    return loss_val

Но я немного беспокоюсь об оптимизаторе. Я слышал, что оптимизаторы имеют внутренние переменные , которые меняют на каждой итерации обучения . Это правда для всех оптимизаторов или только для некоторых, и если да, то какие из них пригодны для этого подхода?

Нейронная сеть должна быть обучена как:

for step in range(training_steps):
    NN.train(inputs, labels, compute_sampling_rate(step))

1 Ответ

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

Прежде всего, должно быть хорошо изменить количество выборок в потере nce, не вызывая проблем для оптимизатора. Внутренние переменные, сохраняемые некоторыми оптимизаторами, относятся к историческим градиентам обучаемых переменных на вашем графике.

Во-вторых, если вы по какой-то причине хотите сбросить состояние вашего оптимизатора, я делаю это, помещая оптимизатор в переменную область видимости. Всякий раз, когда я хочу сбросить его, я запускаю reset_optimizer op.

reset_optimizer = tf.no_op()
with tf.variable_scope('optimizer'):
  train_op = optimizer(learning_rate).minimize(loss)
opt_vars = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, "optimizer")
if len(opt_vars):  # check if optimzer state needs resetting                                                                                          
  reset_optimizer = variables_initializer(opt_vars))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...