【问题标题】:Custom loss function does not minimize in PyTorchPyTorch 中的自定义损失函数不会最小化
【发布时间】:2018-08-04 13:22:38
【问题描述】:

我正在使用 PyTorch 代码在无人监督的环境中训练自定义损失函数。但是,在训练阶段,损失不会下降并且在可能的时期内保持不变。请看下面的训练代码sn-p:

X = np.load(<data path>) #Load dataset which is a numpy array of N points with some dimension each.
num_samples, num_features = X.shape

gmm = GaussianMixture(n_components=num_classes, covariance_type='spherical')
gmm.fit(X)
z_gmm = gmm.predict(X)

R_gmm = gmm.predict_proba(X)
pre_R = Variable(torch.log(torch.from_numpy(R_gmm + 1e-8)).type(dtype), requires_grad=True)
R = torch.nn.functional.softmax(pre_R)

F = torch.stack(Variable(torch.from_numpy(X).type(dtype), requires_grad=True))
U = Variable(torch.from_numpy(gmm.means_).type(dtype), requires_grad=False)

z_pred = torch.max(R, 1)[1]

distances = torch.sum(((F.unsqueeze(1) - U) ** 2), dim=2)
custom_loss = torch.sum(R * distances) / num_samples

learning_rate = 1e-3
opt_train= torch.optim.Adam([train_var], lr = learning_rate)
U = torch.div(torch.mm(torch.t(R), F), torch.sum(R, dim=0).unsqueeze(1)) #In place assignment with a formula over variables and hence no gradient update is needed.

for epoch in range(max_epochs+1):
    running_loss = 0.0
    for i in range(stepSize):
    # zero the parameter gradients
    opt_train.zero_grad()

    # forward + backward + optimize
    loss = custom_loss
    loss.backward(retain_graph=True)
    opt_train.step()
    running_loss += loss.data[0]

if epoch % 25 == 0:
    print(epoch, loss.data[0]) # OR running_loss also gives the same values.
    running_loss = 0.0

O/P: 0 5.8993988037109375 25 5.8993988037109375 50 5.8993988037109375 75 5.8993988037109375 100 5.8993988037109375

我是否在培训中遗漏了什么?我关注了这个example/tutorial。 在这方面的任何帮助和指示将不胜感激。

【问题讨论】:

    标签: deep-learning torch pytorch loss-function autograd


    【解决方案1】:

    为自定义损失函数尝试此结构并进行必要的更改。通过在代码中编写此语句来使用此损失函数:

    criterion = Custom_Loss()
    

    这里我展示了一个名为 Custom_Loss 的自定义损失,它将两种输入 x 和 y 作为输入。然后将 x 重塑为与 y 相似,最后通过计算重塑后的 x 和 y 之间的 L2 差值返回损失。这是您在训练网络中经常遇到的标准问题。

    假设 x 为形状 (5,10),y 为形状 (5,5,10)。所以,我们需要给 x 添加一个维度,然后沿着添加的维度重复它以匹配 y 的维度。然后,(x-y)将是形状(5,5,10)。我们必须将所有三个维度相加,即三个 torch.sum() 才能得到一个标量。

    class Custom_Loss(torch.nn.Module):
    
    def __init__(self):
        super(Regress_Loss,self).__init__()
    
    def forward(self,x,y):
        y_shape = y.size()[1]
        x_added_dim = x.unsqueeze(1)
        x_stacked_along_dimension1 = x_added_dim.repeat(1,NUM_WORDS,1)
        diff = torch.sum((y - x_stacked_along_dimension1)**2,2)
        totloss = torch.sum(torch.sum(torch.sum(diff)))
        return totloss
    

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 2019-05-27
      • 2021-11-13
      • 1970-01-01
      • 2018-09-24
      • 2020-02-25
      • 2021-02-20
      • 2022-08-17
      • 2021-09-26
      相关资源
      最近更新 更多