簡體   English   中英

直接使用梯度急切地更新 keras 模型的權重

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM