मैं Ternsorflow 1.15 में उत्सुक निष्पादन के साथ एक कस्टम अनुकूलक लिख रहा हूं, लेकिन यह पता नहीं लगा सकता कि वज़न को कैसे अपडेट किया जाए। एक उदाहरण के रूप में ढाल वंश को लेते हुए, मेरे पास भार, ढाल और एक अदिश सीखने की दर है, लेकिन यह पता नहीं लगा सकता कि उन्हें कैसे संयोजित किया जाए।

यह ग्रेडिएंट डिसेंट का कार्यान्वयन है जहां मॉडल एक keras.Model उदा। एक बहुपरत सीएनएन:

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
0
KyleL 15 मार्च 2020, 00:08

1 उत्तर

सबसे बढ़िया उत्तर

ढ़ूँढ निकाला। चूंकि दोनों सूचियां हैं, इसलिए हमें प्रत्येक परत के लिए उनके जोड़े के ग्रेडिएंट और चर के माध्यम से एक साथ पुनरावृति करने और इनमें से प्रत्येक को अलग से अपडेट करने की आवश्यकता है।

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)
0
KyleL 17 मार्च 2020, 20:56