簡體   English   中英

PyTorch:損失保持不變

[英]PyTorch: Loss remains constant

我已經使用自己實現的損失函數focal_loss_fixed在PyTorch中編寫了代碼。 但是我的損失價值在每個時期都保持不變。 權重似乎沒有被更新。 這是我的代碼段:

optimizer = optim.SGD(net.parameters(),
                          lr=lr,
                          momentum=0.9,
                          weight_decay=0.0005)


for epoch in T(range(20)):
    net.train()
    epoch_loss = 0
    for n in range(len(x_train)//batch_size):
        (imgs, true_masks) = data_gen_small(x_train, y_train, iter_num=n, batch_size=batch_size)
        temp = []
        for tt in true_masks:
            temp.append(tt.reshape(128, 128, 1))
        true_masks = np.copy(np.array(temp))
        del temp
        imgs = np.swapaxes(imgs, 1,3)
        imgs = torch.from_numpy(imgs).float().cuda()
        true_masks = torch.from_numpy(true_masks).float().cuda()
        masks_pred = net(imgs)
        masks_probs = F.sigmoid(masks_pred)
        masks_probs_flat = masks_probs.view(-1)
        true_masks_flat = true_masks.view(-1)
        print((focal_loss_fixed(tf.convert_to_tensor(true_masks_flat.data.cpu().numpy()), tf.convert_to_tensor(masks_probs_flat.data.cpu().numpy()))))
        loss = torch.from_numpy(np.array(focal_loss_fixed(tf.convert_to_tensor(true_masks_flat.data.cpu().numpy()), tf.convert_to_tensor(masks_probs_flat.data.cpu().numpy())))).float().cuda()
        loss = Variable(loss.data, requires_grad=True)
        epoch_loss *= (n/(n+1))
        epoch_loss += loss.item()*(1/(n+1))
        print('Step: {0:.2f}% --- loss: {1:.6f}'.format(n * batch_size* 100.0 / len(x_train), epoch_loss), end='\r')
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print('Epoch finished ! Loss: {}'.format(epoch_loss))

這是我的“ focal_loss_fixed”函數:

def focal_loss_fixed(true_data, pred_data):
    gamma=2.
    alpha=.25
    eps = 1e-7
    # print(type(y_true), type(y_pred))
    pred_data = K.clip(pred_data,eps,1-eps)
    pt_1 = tf.where(tf.equal(true_data, 1), pred_data, tf.ones_like(pred_data))
    pt_0 = tf.where(tf.equal(true_data, 0), pred_data, tf.zeros_like(pred_data))
    with tf.Session() as sess:
        return sess.run(-K.sum(alpha * K.pow(1. - pt_1, gamma) * K.log(pt_1))-K.sum((1-alpha) * K.pow( pt_0, gamma) * K.log(1. - pt_0)))

在每個時期之后,損耗值保持恆定( 5589.60328 )。 它出什么問題了?

我認為問題出在您的體重下降。

從本質上講,您並不是 將權重乘以 x ,而是將權重乘以x ,這意味着您瞬時只做很小的增量,從而導致(看似)平穩的損失函數。

可以在PyTorch討論論壇(例如herehere )中找到有關此問題的更多說明。
不幸的是,僅SGD的來源也無法告訴您有關其實施的更多信息。 只需將其設置為較大的值,即可獲得更好的更新。 您可以先將其完全忽略掉,然后迭代地減少它(從1.0 ),直到獲得更好的結果。

在計算損失時,您可以調用focal_loss_fixed() ,它使用TensorFlow計算損失值。 focal_loss_fixed()創建一個圖形並在會話中運行它以獲取值,並且到這一點為止,PyTorch不知道導致損失的操作順序,因為它們是由TensorFlow后端計算的。 那么,PyTorch看到的所有loss很可能都是一個常數,就好像您寫過

loss = 3

因此,梯度將為零,並且參數將永遠不會更新。 我建議您使用PyTorch操作重寫損失函數,以便可以計算相對於其輸入的梯度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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