0

我想使用 get_slot_names 从 tensorflow 中的 Momentum 优化器获取插槽的名称,如tensorflow网页中所述。我在我的代码中使用以下行来获取它们:

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

我运行了我的图表,然后当我打印插槽时,它只返回一个空列表。任何帮助将不胜感激。

顺便说一句,我的网络在最大限度地减少损失或其他方面运行良好。另外,我用其他优化器尝试过,但它有同样的问题。

我在 ubuntu 14 中使用 tf 1.3。谢谢,

4

2 回答 2

0

代码中唯一的问题是 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

原因很简单 - 许多插槽是特定于变量的,例如像 Adam 这样的方法将为每个优化变量创建一个插槽,并且在调用 .minimize 之前 - 优化器不知道它将优化哪些变量。

特别是,对于 MomentumOptimizer,您可以保留每个变量的累积梯度。因此,它们不能在调用最小化之前计算。这些累积的梯度存储在“动量”槽中(名称的选择非常糟糕,但这是它们在 TF 中的位置)。

于 2017-08-28T15:57:16.800 回答
0

Slot_names是特定于优化器的。如果您想为每个可训练变量获取插槽,您可以使用get_slot 正确的方法slot_namemomentum_optimizer为is创建的插槽名称(默认情况下)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>
于 2017-08-27T07:11:38.860 回答