Ztráta.backward() ne grad v pytorch NN

0

Otázka

Kód dává chybu ve ztrátě.backward() Chyba je: untimeError: prvek 0 tenzory nevyžaduje grad a nemá grad_fn

for epoch in range(N_EPOCHS):
    model.train()
    for i,(im1, im2, labels) in enumerate(train_dl):
        i1 = torch.flatten(im1,1)
        i2 = torch.flatten(im2,1)
        inp = torch.cat([i1,i2],1)
        
        b_x = Variable(inp) # batch x
        b_y = Variable(labels) # batch y
        y_ = model(b_x).squeeze()
        y_ = (y_>0.5).float()
        
        print(y_)
        print(l)
        loss = criterion(y_,b_y)
        print(loss.item())
        loss.backward()
        optimizer.step()
2
1
y_ = (y_>0.5).float()

má nulový gradient, intuitivně, protože "malé změny v argumentu vést k naprosto žádné změně hodnoty (představte si, že y_ změny malé epsilon, to nemá vliv na hodnotu y_.

2021-11-21 20:01:40

Nepochopil jsem co myslíš tím "vést k naprosto žádné změně"??
Muhammad Muneeb Ur Rahman

Model se vrátí pravděpodobnost, takže jsme udělali prahování, aby to bylo nula nebo jedna.
Muhammad Muneeb Ur Rahman

Myslíte, že o nějaké y_ blízkosti říct 0.7. Bude y_ být jinak, kdyby to změnit tím, že malé epsilon? Ne, to bude 1 neustále. To je "absolutně žádná změna", intuitivní způsob, jak přemýšlet, proč gradient bude 0 (a ještě není implementována). Nelze použít prahování a (přinejmenším naivní) přechod na bázi učení dohromady. Můžete použít prahování, kdy výpočetní hodnocení metrické, ale ne ztrátu chcete odlišit. To je důvod, proč jsme minimalizaci křížové entropii spíše než maximalizaci přesnosti atd.
lejlot

Myslel jsem "*výsledný y_" být jiný, samozřejmě.
lejlot
1

S další info dána OP v komentáři, správný přístup, je zde jen odstranění řádku

y_ = (y_>0.5).float()
2021-11-21 21:00:43

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................