2016-11-24 7 views
1

У меня есть нейронная сеть с тремя скрытыми слоями, которую можно обучить «чистым» градиентным спуском или с помощью более сложных методов. Я также заметил, что в моей проблеме методы оптимизации на основе импульсов (адам, adadelta, импульс) работают намного лучше.Как отключить импульс в определенном слое в тензорном потоке?

Теперь интересная часть. По дизайну я хочу отключить импульс в первом слое NN. Это означает, что я хочу обновить весы Адамом во втором и третьем слоях, но использовать простой градиентный спуск в первом слое.

Конечно, я всегда могу написать собственный оптимизатор: рассчитать градиенты с помощью tf.gradients(loss, tf.trainable_variables()), а затем просто сделать трюк. Но было бы неплохо иметь возможность использовать специальные параметры оптимизатора в каждом слое. Кто-нибудь слышал о том, как это сделать?

+0

Как вы определяете слои в своей сети? – sygi

+0

Ничего особенного, я думаю, что '' 'W_1 = tf.Variable ( tf.truncated_normal ([HIDDEN_0_SIZE, HIDDEN_1_SIZE], StdDev = 1/np.sqrt (HIDDEN_0_SIZE)), имя = 'W') b_1 = тс .Variable (tf.zeros ([HIDDEN_1_SIZE]), имя = 'б') hidden_1 = tf.matmul (activation_0_drop, W_1) + b_1 activation_1 = tf.nn.relu (hidden_1, имя = 'активации') activation_1_drop = tf.nn.dropout (activation_1, keep_prob) '' 'Не знаю, почему, markdown удаляет все новые строки :( – iezepov

+0

Он просто не работает с комментариями, если вы редактируете сообщение, новые строки будут там :) – sygi

ответ

1

Ну, вы можете предоставить список переменных для оптимизации оптимизатора (docs):

opt = tf.train.AdamOptimizer() 
opt_op = opt.minimize(loss, var_list=[W1, b1]) 
opt2 = tf.train.GradientDescentOptimizer(learning_rate) 
opt2_op = opt2.minimize(loss, var_list=[W2, b2]) 

Вы должны извлечь список переменного (возможно, весы и смещает) данный слой самостоятельно.

+0

Спасибо за идею! Но таким образом я могу полностью отключить обучение на первом уровне, не предоставив его оптимизатору. Но я все еще хочу обучать его, но с использованием импульса. Возможно, у меня могут быть два оптимизатора: GradientDescent для первого слоя и Adam для всего остального. – iezepov

+1

См. Редактирование. Если вы определяете два оптимизатора, каждый из них может обновлять соответствующие переменные. И если вы запускаете их вместе в 'sess.run ([opt_op, opt2_op])', я бы _suspect_, что градиенты будут вычисляться только один раз. – sygi