添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
深情的韭菜  ·  ASP.NET Core Web Host ...·  1 年前    · 
自信的槟榔  ·  Source maps are not ...·  1 年前    · 
坚强的罐头  ·  403 Bypass Tool For ...·  2 年前    · 
犯傻的毛衣  ·  python支持泛型编程吗 ...·  2 年前    · 
备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 计算机视觉理论及其实现 Pytorch训练网络模型过程中Loss为负值的问题及其解决方案
3 0

海报分享

Pytorch训练网络模型过程中Loss为负值的问题及其解决方案

1. 问题描述

在复现论文的过程中,遇到了训练模型Loss一直为负的情况。

程序主要通过深度学习实现一个分类任务。编程与debug过程全部在windows10系统,Pycharm2018v1.4的IDE下完成,主要框架为pytorch 1.2.0。复现过程中采用了交叉熵损失函数计算Loss。训练过程中输出信息如下:

输出部分的代码段:

for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target.squeeze())
loss.backward()
optimizer.step()
if batch_idx % log_interval == 0:
print("Train Epoch: {} [{}/{} ({:0f}%)]\tLoss:{:.6f}".format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100.*batch_idx/len(train_loader), loss.item()
print("output:", output)

2. 解决过程与方案

在检查确认训练代码无误之后,通过查找资料和逐步排查,寻找到了两个出错原因。

针对交叉熵损失函数:

一般情况下,分类任务的输出y采用One-hot Encoding,即每个值非0即1,对应公式中的y或(1-y)一定是1,而一定要是负值才能保证Loss大于零。所以初步判断实验数据和模型输出是错误的根源。

原因一 输入数据未归一化

数据没有归一化会造成取对数的过程中数据跨度超过了[0,1]这个范围,那么自然会造成为正,从而Loss小于零。解决办法就是对数据进行归一化。于是构造了一个归一化函数,从而解决问题。代码如下:

def data_in_one(inputdata):
    min = np.nanmin(inputdata)
    max = np.nanmax(inputdata)
    outputdata = (inputdata-min)/(max-min)