[英]Eagerly update a keras model's weights directly using the gradient
我正在 Ternsorflow 1.15 中使用 Eager Execution 編寫自定義優化器,但無法弄清楚如何更新權重。 以梯度下降為例,我有權重、梯度和標量學習率,但不知道如何組合它們。
這是梯度下降的實現,其中模型是keras.Model
例如多層 CNN:
lr = tf.constant(0.01)
def minimize(model, inputs, targets):
with tf.GradientTape() as tape:
logits = model(input)
loss_value = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=targets)
grad = tape.gradient(loss_value, model.trainable_variables)
step = tf.multiply(self.lr, grad)
model.trainable_variables.assign_sub(step)
但它在tf.multiply
上失敗了
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shapes of all inputs must match: values[0].shape = [5,5,1,6] != values[1].shape = [6] [Op:Pack] name: packed
我也知道最后一行會失敗,因為trainable_variables
是一個列表並且沒有方法assign_sub
。
我怎樣才能重寫我的代碼的最后兩行:
model.trainable_variables -= lr * grad
弄清楚了。 由於兩者都是列表,我們需要一起迭代每層的梯度和變量對,並分別更新它們中的每一個。
lr = tf.constant(0.01)
def minimize(model, inputs, targets):
with tf.GradientTape() as tape:
logits = model(input)
loss_value = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=targets)
grad = tape.gradient(loss_value, model.trainable_variables)
for v, g in zip(model.trainable_variables, grad):
v.assign_sub(lr * g)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.