解决pytorch下出现multi-target not supported at的一种可能原因

在使用交叉熵损失函数的时候,target的形状应该是和label的形状一致或者是只有batchsize这一个维度的。

如果target是这样的【batchszie,1】就会出现上述的错误。

改一下试试,用squeeze()函数降低纬度,

如果不知道squeeze怎么用的,

可以参考这篇文章。pytorch下的unsqueeze和squeeze用法

这只是一种可能的原因。

补充:pytorch使用中遇到的问题

1. load模型参数文件时,提示torch.cuda.is_available() is False。

按照pytorch官方网页又安装了一次pytorch,而不是直接使用清华源,执行pip install torch,暂时不知道为什么。

2. 使用CrossEntropyLoss时,要求第一个参数为网络输出值,FloatTensor类型,第二个参数为目标值,LongTensor类型。否则

需要在数据读取的迭代其中把target的类型转换为int64位的:target = target.astype(np.int64),这样,输出的target类型为torch.cuda.LongTensor。(或者在使用前使用Tensor.type(torch.LongTensor)进行转换)。

3.

RuntimeError: multi-target not supported at /pytorch/torch/lib/THCUNN/generic/ClassNLLCriterion.cu
loss += F.cross_entropy( scores, captions )

出错原因:

scores, captions的维度与F.cross_entropy()函数要求的维度不匹配,

例如出错的维度为scores=[batch, vocab_size], captions=[batch, 1]

解决:

loss += F.cross_entropy( scores, captions.squeeze() )

注,这个scores必须是N*C维,C指类别数。

4. pytorch训练过程中使用大量的CPU资源

当我使用pycharm运行 (https://github.com/Joyce94/cnn-text-classification-pytorch ) pytorch程序的时候,在Linux服务器上会开启多个进程,占用服务器的大量的CPU,在windows10上运行此程序的时候,本机的CPU和内存会被吃光,是因为在train.py中有大量的数据训练处理,会开启多个进程,占用大量的CPU和进程。

本机window10

linux服务器开启了多个进程

Linux服务器占用大量CPU

在pytorch中提供了(http://pytorch.org/docs/master/multiprocessing.html)muliprocessing多进程管理,其中有Pool进程池、Process()等对进程进行管理,可能是我使用的方式不对,反正是没有什么效果。

然而最简单的也是最好的解决办法 :

torch.set_num_threads(int thread) ,可以很好的解决windows问题,参考(http://pytorch.org/docs/master/torch.html#parallelism) 然而,在linux服务器上还是有一些问题的,export OMP_NUM_THREADS = 1 可以解决Linux问题。

经验证:export OMP_NUM_THREADS=1确实在pycaffe/pytorch中可以有效降低CPU使用率且提高程序运行速度,考虑可能是程序并不需要这么大的计算量,但是开了很多线程并行进行相同的计算,最后还需要同步结果,浪费了大量的计算量。

5. 在pytorch框架下编译模块的时候遇到 in <module>

raise ImportError("torch.utils.ffi is deprecated. Please use cpp extensions instead.")
ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.

解决:pytorch版本与其他库的版本不匹配。我当时装的是1.0.0,降低版本到0.4.0后问题解决。

6.pytorch设置GPU,os.environ['CUDA_VISIBLE_DEVICES']='X'要放在主程序的最前端,否则设置GPU可能无效。

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

(0)

相关推荐

  • pytorch中index_select()的用法详解

    pytorch中index_select()的用法 index_select(input, dim, index) 功能:在指定的维度dim上选取数据,不如选取某些行,列 参数介绍 第一个参数input是要索引查找的对象 第二个参数dim是要查找的维度,因为通常情况下我们使用的都是二维张量,所以可以简单的记忆: 0代表行,1代表列 第三个参数index是你要索引的序列,它是一个tensor对象 刚开始学习pytorch,遇到了index_select(),一开始不太明白几个参数的意思,后来查了一

  • 教你一分钟在win10终端成功安装Pytorch的方法步骤

    小书学习的主要方向是TensorFlow和Pytorch,今天就来安装一下Pytorch. 第一步:去官网看看 Pytorch官网:(https://pytorch.org/) 点击get started 第二步:选择与自己相匹配的版本,这里显示是我安装的选择. 复制命令到win10终端: 第三步:成功安装: C:\Users\Shu\Desktop>pip3 install http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-w

  • 详解win10下pytorch-gpu安装以及CUDA详细安装过程

    1.Cuda的下载安装及配置 首先我们要确定本机是否有独立显卡.在计算机-管理-设备管理器-显示适配器中,查看是否有独立显卡. 可以看到本机有一个集成显卡和独立显卡NVIDIA GetForce GTX 1050. 接下来,测试本机独立显卡是否支持CUDA的安装,点击此处查询显卡是否在列表中. 从上图中,可以看到我本机的独立显卡是支持CUDA安装的,计算力是6.1. 那么,接下来就是选择CUDA进行安装即可,点击此处 这里我选了CUDA Toolkit10.0的版本,至于选择哪个版本,个人认为应

  • anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)

    1. 创建一个新的环境 打开Anaconda Navigator,找不到的win10左下角输入一下就能找到了,如下图. 这里通过列表下面的create按钮可以创建一个新的环境,这里我将新环境起名为torch,右面列表中是我安装好的包,刚创建的时候没有这么多. 2. 从pytorch官网得到获取包的命令 打开Anaconda Prompt,输入activate 刚刚创建的环境名可以切换到刚刚创建的环境.这里我用的是下面的命令,你需要根据自己创建的环境名修改相应的激活名称. activate tor

  • pytorch下的unsqueeze和squeeze的用法说明

    #squeeze 函数:从数组的形状中删除单维度条目,即把shape中为1的维度去掉 #unsqueeze() 是squeeze()的反向操作,增加一个维度,该维度维数为1,可以指定添加的维度.例如unsqueeze(a,1)表示在1这个维度进行添加 import torch a=torch.rand(2,3,1) print(torch.unsqueeze(a,2).size())#torch.Size([2, 3, 1, 1]) print(a.size()) #torch.Size([2,

  • Pytorch 图像变换函数集合小结

    一.必要的 python 模块 PyTorch 的 Vision 模块提供了图像变换的很多函数. torchvision/transforms/functional.py from __future__ import division import torch import sys import math from PIL import Image, ImageOps, ImageEnhance, PILLOW_VERSION try: import accimage except Import

  • 解决pytorch下出现multi-target not supported at的一种可能原因

    在使用交叉熵损失函数的时候,target的形状应该是和label的形状一致或者是只有batchsize这一个维度的. 如果target是这样的[batchszie,1]就会出现上述的错误. 改一下试试,用squeeze()函数降低纬度, 如果不知道squeeze怎么用的, 可以参考这篇文章.pytorch下的unsqueeze和squeeze用法 这只是一种可能的原因. 补充:pytorch使用中遇到的问题 1. load模型参数文件时,提示torch.cuda.is_available() i

  • 解决pytorch下只打印tensor的数值不打印出device等信息的问题

    torch.Tensor类型的数据loss和acc打印时 如果写成以下写法 print('batch_loss: '+str(loss.data)+'batch acc: '+str(acc.data)) 则不仅会打印出loss和acc的值,还会打印出device信息和 tensor字样,如下: 如果仅想打印出数值,使得打印出的信息更加简洁 则要用以下写法 print('batch_loss: {:.3f} batch acc: {:.3f}'.format(loss.data, acc.dat

  • 解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题

    背景 在公司用多卡训练模型,得到权值文件后保存,然后回到实验室,没有多卡的环境,用单卡训练,加载模型时出错,因为单卡机器上,没有使用DataParallel来加载模型,所以会出现加载错误. 原因 DataParallel包装的模型在保存时,权值参数前面会带有module字符,然而自己在单卡环境下,没有用DataParallel包装的模型权值参数不带module.本质上保存的权值文件是一个有序字典. 解决方法 1.在单卡环境下,用DataParallel包装模型. 2.自己重写Load函数,灵活.

  • 解决pycharm下os.system执行命令返回有中文乱码的问题

    如下所示: source = ['C:\\Users\\admin\\Desktop\\pythonLearning'] target_dir = 'C:\\Users\\admin\\Desktop' print(time.strftime('%Y%m%d%H%M%S')) target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip' if not os.path.exists(target_dir): os.mkd

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

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

  • 解决Python下json.loads()中文字符出错的问题

    Python:2.7 IDE:Pycharm5.0.3 今天遇到一个问题,就是在使用json.load()时,中文字符被转化为Unicode码的问题,解决方案找了半天,无解.全部代码贴出,很简单的一个入门程序,抓的是有道翻译的,跟着小甲鱼的视频做的,但是他的版本是python3.4,所以有些地方还需要自己改,不多说,程序如下: import urllib#python2.7才需要两个urllib url="http://fanyi.youdao.com/translate?smartresult

  • pytorch下使用LSTM神经网络写诗实例

    在pytorch下,以数万首唐诗为素材,训练双层LSTM神经网络,使其能够以唐诗的方式写诗. 代码结构分为四部分,分别为 1.model.py,定义了双层LSTM模型 2.data.py,定义了从网上得到的唐诗数据的处理方法 3.utlis.py 定义了损失可视化的函数 4.main.py定义了模型参数,以及训练.唐诗生成函数. 参考:电子工业出版社的<深度学习框架PyTorch:入门与实践>第九章 main代码及注释如下 import sys, os import torch as t fr

  • 解决pytorch 交叉熵损失输出为负数的问题

    网络训练中,loss曲线非常奇怪 交叉熵怎么会有负数. 经过排查,交叉熵不是有个负对数吗,当网络输出的概率是0-1时,正数.可当网络输出大于1的数,就有可能变成负数. 所以加上一行就行了 out1 = F.softmax(out1, dim=1) 补充知识:在pytorch框架下,训练model过程中,loss=nan问题时该怎么解决? 当我在UCF-101数据集训练alexnet时,epoch设为100,跑到三十多个epoch时,出现了loss=nan问题,当时是一脸懵逼,在查阅资料后,我通过

  • 解决linux下openoffice word文件转PDF中文乱码的问题

    网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报错,但转换后的PDF中是乱码,尝试在jre/lib/fonts/中增加字体,还是不能解决问题,因此可以判断非jre字体问题,是linux系统字体问题. 用vim /etc/fonts/fonts.conf,可以看到系统字体文件在/usr/share/fonts,将windows系统字体文件连接到此目录下 ln -s /usr/local/fonts fonts 然后更新缓存:fc-cache 重启openoffice: /o

  • 解决ubuntu下vi上下左右方向键出现字母backspace键不能删除字符 问题

    在vmware虚拟机中安装ubuntu下使用vi编辑文件,发现上下左右方向键不能在文本中移动,出现ABCD字符,backspace也不能删除字符,解决方法有几种 方法1:将vimrc档案拷贝到home目录 $cp /etc/vim/vimrc ~/.vimrc 方法2:卸载vim-tiny,安装vim-full ubuntu默认安装装的是vim tiny版本,而需要的是vim full版本.执行下面的语句安装vim full版本: $sudo apt-get remove vim-common

随机推荐