Получить имя слотов для оптимизатора импульса в тензорном потоке

Я хочу получить имена слотов от оптимизатора Momentum в тензорном потоке с использованием get_slot_names, как это объясняется здесь на веб-странице tensorflow. Я использую следующую строку в своем коде, чтобы получить их:

slots=tf.train.MomentumOptimizer(learning_rate=1e-3, momentum=0.9,).get_slot_names()

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

Кстати, моя сеть работает нормально в минимизации потерь или для других вещей. Кроме того, я пробовал это с другими оптимизаторами, но у них та же проблема.

Я использую tf 1.3 в Ubuntu 14. Спасибо,


person AliAsghar Mortazi    schedule 27.08.2017    source источник


Ответы (2)


Slot_names зависят от оптимизатора. Если вы хотите получить слот для каждой обучаемой переменной, вы можете использовать get_slot с правильным slot_name. Имя слота, созданное (по умолчанию) для momentum_optimizer, — momentum. Ниже приведен простой пример, иллюстрирующий суть.

x_input = np.linspace(0, 30, 200)
y_input = 4 * x_input + 6
W = tf.Variable(0.0, name="weight")
b = tf.Variable(0.0, name="bias")
X = tf.placeholder(tf.float32, name='InputX')
Y = tf.placeholder(tf.float32, name='InputY')
Y_pred = X * W + b

loss = tf.reduce_mean(tf.square(Y_pred - Y))

# define the optimizer
optimizer = tf.train.MomentumOptimizer(learning_rate=0.001, momentum=.9)

# training op
train_op = optimizer.minimize(loss)

# print the optimizer slot name
print(optimizer.get_slot_names())

# Results:['momentum']

# print out slot created for each trainable variables using the slot_name from above result
for v in tf.trainable_variables():
    print(optimizer.get_slot(v, 'momentum'))

# Results: <tf.Variable 'weight/Momentum:0' shape=() dtype=float32_ref>
           <tf.Variable 'bias/Momentum:0' shape=() dtype=float32_ref>
person Ishant Mrinal    schedule 27.08.2017
comment
Спасибо за ответ. Итак, вы имеете в виду, что он может только вернуть импульс? Поскольку это упоминается в [tensorflow.org/versions /r1.3/api_docs/python/tf/train/ , я думал, что он также может возвращать переменную «накопление» в формулировке импульса. - person AliAsghar Mortazi; 28.08.2017
comment
Это просто случай непоследовательного именования в TF. Переменные слота импульса на самом деле накапливаются из формулировки, в то время как импульс из формулировки — это просто число с плавающей запятой, гиперпараметр, хранящийся в opt._momentum. - person lejlot; 28.08.2017
comment
@AliAsgharMortazi Как я уже упоминал в этом ответе, вы можете использовать get_slot для получения накопленных переменных и значений. Смотрите мой пример. - person Ishant Mrinal; 28.08.2017

Единственная проблема в коде заключается в том, что slot_variables создаются во время вызова минимизации (фактически в apply_gradients). А поскольку вы вызываете get_slot_variables() до, они пусты.

Итак, вместо

slots=tf.train.MomentumOptimizer(learning_rate=1e-3, momentum=0.9,).get_slot_names() 

ты должен сделать

opt = tf.train.MomentumOptimizer(learning_rate=1e-3, momentum=0.9,)

train_op = opt.minimize(your_loss) # or anything else

slota = opt.get_slot_names() # this will work

Причина этого очень проста — многие слоты специфичны для переменных, например, такие методы, как Адам, создадут один слот для каждой оптимизированной переменной, и перед вызовом .minimize — оптимизатор не знает, какие это будут переменные. оптимизация.

В частности, для MomentumOptimizer вы сохраняете накопленные градиенты для каждой переменной. Следовательно, они не могут быть вычислены до вызова функции минимизации. Эти накопленные градиенты хранятся в слоте "импульс" (довольно неудачный выбор для названия, но именно здесь они находятся в TF).

person lejlot    schedule 28.08.2017
comment
Это сработало, однако кажется странным, почему это нужно делать! В любом случае, спасибо, и я не знаю, почему вы получили отрицательный голос. Кроме того, знаете ли вы, могу ли я (и как) изменить значение накопления, которое передается минимизатору? Предположим, я хочу добавить накопление с числом (альфа), а затем обновить параметры - person AliAsghar Mortazi; 28.08.2017
comment
Что ж, это одно из многих трудных дизайнерских решений, которые пришлось принять людям из TF. Что касается модификации оптимизатора - это невозможно сделать без создания собственного оптимизатора. С другой стороны, это не должно быть так сложно, просто скопируйте MomentumOptimizer и настройте его процедуру apply_gradients для использования вашего дополнительного сигнала. Это снова исходит из предположения TF о том, что график является только добавленным - вы не можете изменить сжатый график, и, поскольку apply_gradients уже создает график всего обновления, вам нужно изменить его логику, чтобы изменить его в любом случае. - person lejlot; 28.08.2017
comment
Я надеялся, что есть более простое решение! В любом случае, спасибо. - person AliAsghar Mortazi; 29.08.2017