Pytorch训练网络过程中loss突然变为0的解决方案

问题

// loss 突然变成0
python train.py -b=8
INFO: Using device cpu
INFO: Network:
        1 input channels
        7 output channels (classes)
        Bilinear upscaling
INFO: Creating dataset with 868 examples
INFO: Starting training:
        Epochs:          5
        Batch size:      8
        Learning rate:   0.001
        Training size:   782
        Validation size: 86
        Checkpoints:     True
        Device:          cpu
        Images scaling:  1

Epoch 1/5:  10%|██████████████▏                                                                                                                            | 80/782 [01:33<13:21,  1.14s/img, loss (batch)=0.886I
NFO: Validation cross entropy: 1.86862473487854
Epoch 1/5:  20%|███████████████████████████▊                                                                                                            | 160/782 [03:34<11:51,  1.14s/img, loss (batch)=2.35e-7I
NFO: Validation cross entropy: 5.887489884504049e-10
Epoch 1/5:  31%|███████████████████████████████████████████▌                                                                                                  | 240/782 [05:41<11:29,  1.27s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  41%|██████████████████████████████████████████████████████████                                                                                    | 320/782 [07:49<09:16,  1.20s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  51%|████████████████████████████████████████████████████████████████████████▋                                                                     | 400/782 [09:55<07:31,  1.18s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  61%|███████████████████████████████████████████████████████████████████████████████████████▏                                                      | 480/782 [12:02<05:58,  1.19s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  72%|█████████████████████████████████████████████████████████████████████████████████████████████████████▋                                        | 560/782 [14:04<04:16,  1.15s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  82%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏                         | 640/782 [16:11<02:49,  1.20s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  92%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋           | 720/782 [18:21<01:18,  1.26s/img, loss (batch)=0I
NFO: Validation cross entropy: 0.0
Epoch 1/5:  94%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋        | 736/782 [19:17<01:12,  1.57s/img, loss (batch)=0]
Traceback (most recent call last):
  File "train.py", line 182, in <module>
    val_percent=args.val / 100)
  File "train.py", line 66, in train_net
    for batch in train_loader:
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 819, in __next__
    return self._process_data(data)
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 846, in _process_data
    data.reraise()
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/_utils.py", line 385, in reraise
    raise self.exc_type(msg)
RuntimeError: Caught RuntimeError in DataLoader worker process 4.
Original Traceback (most recent call last):
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py", line 47, in fetch
    return self.collate_fn(data)
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/_utils/collate.py", line 74, in default_collate
    return {key: default_collate([d[key] for d in batch]) for key in elem}
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/_utils/collate.py", line 74, in <dictcomp>
    return {key: default_collate([d[key] for d in batch]) for key in elem}
  File "/public/home/lidd/.conda/envs/lgg2/lib/python3.6/site-packages/torch/utils/data/_utils/collate.py", line 55, in default_collate
    return torch.stack(batch, 0, out=out)
RuntimeError: Expected object of scalar type Double but got scalar type Byte for sequence element 4 in sequence argument at position #1 'tensors'

交叉熵损失函数是衡量输出与标签之间的损失,通过求导确定梯度下降的方向。

loss突然变为0,有两种可能性。

一是因为预测输出为0,二是因为标签为0。

如果是因为标签为0,那么一开始loss就可能为0.

检查参数初始化

检查前向传播的网络

检查loss的计算格式

检查梯度下降

是否出现梯度消失。

实际上是标签出了错误

补充:pytorch训练出现loss=na

遇到一个很坑的情况,在pytorch训练过程中出现loss=nan的情况

有以下几种可能:

1.学习率太高。

2.loss函数有问题

3.对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决

4.数据本身,是否存在Nan、inf,可以用np.isnan(),np.isinf()检查一下input和target

5.target本身应该是能够被loss函数计算的,比如sigmoid激活函数的target应该大于0,同样的需要检查数据集

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 关于pytorch中网络loss传播和参数更新的理解

    相比于2018年,在ICLR2019提交论文中,提及不同框架的论文数量发生了极大变化,网友发现,提及tensorflow的论文数量从2018年的228篇略微提升到了266篇,keras从42提升到56,但是pytorch的数量从87篇提升到了252篇. TensorFlow: 228--->266 Keras: 42--->56 Pytorch: 87--->252 在使用pytorch中,自己有一些思考,如下: 1. loss计算和反向传播 import torch.nn as nn

  • 解决Pytorch训练过程中loss不下降的问题

    在使用Pytorch进行神经网络训练时,有时会遇到训练学习率不下降的问题.出现这种问题的可能原因有很多,包括学习率过小,数据没有进行Normalization等.不过除了这些常规的原因,还有一种难以发现的原因:在计算loss时数据维数不匹配. 下面是我的代码: loss_function = torch.nn.MSE_loss() optimizer.zero_grad() output = model(x_train) loss = loss_function(output, y_train)

  • pytorch 在网络中添加可训练参数,修改预训练权重文件的方法

    实践中,针对不同的任务需求,我们经常会在现成的网络结构上做一定的修改来实现特定的目的. 假如我们现在有一个简单的两层感知机网络: # -*- coding: utf-8 -*- import torch from torch.autograd import Variable import torch.optim as optim x = Variable(torch.FloatTensor([1, 2, 3])).cuda() y = Variable(torch.FloatTensor([4,

  • Pytorch中accuracy和loss的计算知识点总结

    这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚. 给出实例 def train(train_loader, model, criteon, optimizer, epoch): train_loss = 0 train_acc = 0 num_correct= 0 for step, (x,y) in enumerate(train_loader): # x: [b, 3, 224, 224], y: [b] x, y = x.to(device), y.to(de

  • 记录模型训练时loss值的变化情况

    记录训练过程中的每一步的loss变化 if verbose and step % verbose == 0: sys.stdout.write('\r{} / {} : loss = {}'.format( step, total_steps, np.mean(total_loss))) sys.stdout.flush() if verbose: sys.stdout.write('\r') sys.stdout.flush() 一般我们在训练神经网络模型的时候,都是每隔多少步,输出打印一下l

  • Pytorch训练网络过程中loss突然变为0的解决方案

    问题 // loss 突然变成0 python train.py -b=8 INFO: Using device cpu INFO: Network: 1 input channels 7 output channels (classes) Bilinear upscaling INFO: Creating dataset with 868 examples INFO: Starting training: Epochs: 5 Batch size: 8 Learning rate: 0.001

  • 解决pytorch GPU 计算过程中出现内存耗尽的问题

    Pytorch GPU运算过程中会出现:"cuda runtime error(2): out of memory"这样的错误.通常,这种错误是由于在循环中使用全局变量当做累加器,且累加梯度信息的缘故,用官方的说法就是:"accumulate history across your training loop".在默认情况下,开启梯度计算的Tensor变量是会在GPU保持他的历史数据的,所以在编程或者调试过程中应该尽力避免在循环中累加梯度信息. 下面举个栗子: 上代

  • Vue组件传值过程中丢失数据的分析与解决方案

    前言 在上一篇文章 JavaScript 中的两种数据类型中,分别介绍了基本类型和引用类型,以及引用类型的浅拷贝与深拷贝.这里需要注意的是,该文章中深拷贝引用类型值的方法,并不是完美的,引用类型值中的某些属性值,仍不能完整地复制到新的变量中.比如函数值,在深拷贝过程中,就会丢失. 问题 在实际项目中,假如使用了二次封装的组件,并且封装的组件内部做了一些属性值的深拷贝操作,就有极有可能因为传入的属性值是引用类型的值,导致丢失部分数据. 举例 以基于 el-table 封装的 ak-table 组件

  • node.js多个异步过程中判断执行是否完成的解决方案

    前言 本文主要给大家介绍了关于node.js多个异步过程中判断执行是否完成的相关内容,可能这样说大家不是很明白,下面来一起看看详细的介绍吧. 场景: 想请求量较大的网络数据,比如想获取1000条结果,但数据处理速度慢,有超时的风险,可以分成10次处理,每次处理100条:所有请求完成后再统一进行处理. 这样的应用场景,可以这样处理: 方案一:判断请求到的数据条目 // 模拟网络请求 function fetch(url, callback) { setTimeout(function (){ ca

  • 使用Pytorch训练two-head网络的操作

    之前有写过一篇如何使用Pytorch实现two-head(多输出)模型 在那篇文章里,基本把two-head网络以及构建讲清楚了(如果不清楚请先移步至那一篇博文). 但是我后来发现之前的训练方法貌似有些问题. 以前的训练方法: 之前是把两个head分开进行训练的,因此每一轮训练先要对一个batch的数据进行划分,然后再分别训练两个头.代码如下: f_out_y0, _ = net(x0) _, f_out_y1 = net(x1) #实例化损失函数 criterion0 = Loss() cri

  • IIS7.0配置过程中出现HTTP 错误 403.14的解决方法

    在Win7系统下IIS7.0配置的过程中出现如下错误页面: 解决方案: 1.打开IIS管理器. 2.在"功能"视图中,双击"目录浏览". 3.在"目录浏览"页上,在"操作"窗格中单击"启用". 4.设置好后就可以访问发布的文件了: 在iis安装过程中遇到的问题,大家都可以查看我们里的相关内容进行解决. 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • 解决Pytorch在测试与训练过程中的验证结果不一致问题

    引言 今天在使用Pytorch导入此前保存的模型进行测试,在过程中发现输出的结果与验证结果差距甚大,经过排查后发现是forward与eval()顺序问题. 现象 此前的错误代码是 input_cpu = torch.ones((1, 2, 160, 160)) target_cpu =torch.ones((1, 2, 160, 160)) target_gpu, input_gpu = target_cpu.cuda(), input_cpu.cuda() model.set_input_2(

  • PyTorch训练LSTM时loss.backward()报错的解决方案

    训练用PyTorch编写的LSTM或RNN时,在loss.backward()上报错: RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time. 千万别改成loss.backward(retain_graph=Tru

随机推荐