当前位置:首页 > 建站教程 > 正文内容

index跳转代码(css跳转代码)

建站教程5小时前1

以下坑或 Bug 以 v1.0rc1 版本为准,其他人的答案绝大部分已经过时。

you should never change the actual parameter to a new one after wrapping up your model with DDP

详见:DistributedDataParallel does not get the same grad at all. · Issue #12603 · pytorch/pytorch

clone 并不会变成一个 leaf varaible

换句话说 b = a.clone 且反向传播时,b 不会有 grad 属性,因为它有 grad_fn 且就是 clonebackward,所以它并不是独立于 a 之外的 graph leaf,a 才是真正的 leaf,于是一般情况下 b 的梯度就直接赋值给 a.grad。

resume sheduler 前需要手动给 optimizer.pramgroups 设置 initial_lr

否则会触发 KeyError,我猜因为 optimzier 本身的 lr 不一定是真正的 initial_lr ,也有可能处于 resume 来的中间状态。但文档没有明确说明,需要查看源代码排错,太不友好了。其实可以在 optimizer 类本身追加 initial_lr 参数解决。我准备发起 PR。

reshape 并不与 view 等价

参见 What's the difference between reshape and view in pytorch? 虽然我不清楚 reshape 到底在什么情况下会触发 copy。

nn.DataParallel 负载不平衡

主要因为模型本身负载平均了,但输出和 loss 却没不一定跟着平均,于是所有 node 的输出全一口气汇集到某 node 上以喂给该 node 上的 loss,最终得到总输出,于是就不均衡了。

其实这不该全怪 nn.DataParallel,用户也可以直接让被负载均衡的模型来输出 loss,于是 loss 也会被自动均衡,只要 loss 本身有被 reduce,那么把每个 GPU 上的 loss Reduce 到 master device 上的新 Tensor 本身就小得可以忽略。或者用 nn.DistributedDataParallel 代替也可以。

nn.Module 没有 device 参数

都有 to 了,但却不像 Tensor 有 device , 很不方便,我在和官方讨论如何改进:[Feature Request] nn.Module should also get a `device` attribute · Issue #7460 · pytorch/pytorch

scheduler.step 要在 optimizer.step 前执行

展开全文

我先前以为只要 scheduler 初始化就是最开始的学习率,然而要先手动执行 step 一次才是真正的最初学习率,可参见官方文档的此函数的 example。我以前在 epoch 迭代完后才 step 一次,这造成前两次 epoch 的学习率一样。同时,last epoch 是上一次迭代完的最终索引值且从零开始编号,于是新开始下一轮迭代时,要从 last epoch + 1 开始迭代。

预训练模型用的预处理和 Caffe 的不一样

输入被 ToTenser rescale from [0, 255] to [0, 1],而且还被 normalize,于是没法直接套用基于 Caffe 实现的超参数了。

torchvision 提供的 VGG 模型可能没有达到论文预期

参见:Weird results in training FCN-32s in PyTorch

我也见到 discussion 上一些类似的 report 了。

DataLoader 有 ulimit 上限

其实我不清楚这算不算官方的锅,好像有人批评 DataLoader 没有释放好 file deer: DataLoader causing `RuntimeError: received 0 items of ancdata` · Issue #973 · pytorch/pytorch 某简易解决方案也在其 issue 楼下给出了。

Module.parameters 返回生成器

于是没法使用多次,官方拒绝修正,参见:`parameters` should be a list, not an iterator · Issue #2954 · pytorch/pytorch

有人质疑:「parameter 那個是你每調用一次這個函數就給你一個生成器,這個生成器迭代完了當然就完了,但你可以再調用一次這個函數呀。這個不是坑,這是 python 生成器本來的用法」

动态分配的内存很不确定

今天跑脚本,执行完 train 轮到执行 test 时,函数体几乎一模一样,用同一个模型,batchsize 也一样,理论上由于 net.eval 内存占用会更少,但会报内存不够用的错误,不知道这函数跳转之间到底发生了什么。害得我只能设置 test 的 batchsize 为 device_id 的数量,同时也没法用 cudnn.benchmarks 优化了。据说「最后用 with torch.no_grad: 把 val/test 函数包住 一行解决了。」。

torch.cat 不支持直接把 list of int/float 转变成 LongTensor/Tensor

这和 numpy.concatenate 不一样。torch.stack 估计也不能。

nonzero 和 Numpy 的同名函数很不一样

核心开发者之一也想改成后者了:nonzero doesn't squeeze dimension · Issue #1834 · pytorch/pytorch

Tensor/Variable 的 cuda 不是 in-place, Module 则反

这不一致的,好在目前也可以把后者赋值给自我一遍。

没有官方 benchmarks 证实 "Tensors and Dynamic neural networks in Python with strong GPU acceleration." 的主张

这主张就是 PyTorch 官网的第一句话,于是我在论坛提出问题:Do you encourage user to use torch.Tensor instead of Numpy? 没有官方答复,于是存疑,用户得自己亲自写 benchmarks 来解决。

大概由于用户爆出 PyTorch 0.2 相对于 0.1.9 有严重的 CPU 性能下降 bug, 官方终于开始写 pytorch/benchmark 了。

不支持 negative slice

对 Tensor 取 [::-1] 会报错:slice step has to be greater than 0。我去都号称支持 Advanced Indexing 了还不支持这个?

不支持 Poly Scheluer

Poly Scheluer 是 Deeplab 提出的重要语义分割训练法,我提 feature issue, 一个月过去了没回应:Add the new lr_scheduler which called poly · Issue #2854 · pytorch/pytorch 真不知道 FAIR 在忙啥。

torchvision 用 PIL 而不是 scikit-image 图像处理

于是就要额外花时间记忆 PIL 的 Image 类型以及其方法,没法像 Numpy 用户能直接无缝使用 scikit-image.

from_numpy 不支持把 numpy 里的 int8 ndarray 转换成 CharTensor

参见:Support int16 numpy conversions · Issue #891 · pytorch/pytorch

optimizer 里面没有 lr 作为 attribute

参见:Expose optimizer options as attributes when there's a single param group · Issue #1736 · pytorch/pytorch

torch.zeros(4, 0) 返回的不是真正的 0 dimension tensor

和 Numpy 不一样,参见:torch.zeros(4, 0) returns a Tensor whose size is 4, not 0 · Issue #7785 · pytorch/pytorch

以下坑已解决,特此归档

CUDA_LAUNCH_BLOCKING 不支持并发模型

参见 DataParallel model stucks with CUDA_LAUNCH_BLOCKING=1 sometime · Issue #9163 · pytorch/pytorch

已解决,用 CUDA 9 即可: https://github.com/NVIDIA/nccl/

刚踩的坑, 差点就哭出来了TT. --- 我明明加了一百个dropout, 为什么结果一点都没变

使用F.dropout ( nn.functional.dropout )的时候需要设置它的training这个状态参数与模型整体的一致.

比如:

index跳转代码(css跳转代码)

ClassDropoutFC(nn.Module):

def__init__(self):

super(DropoutFC,self).__init__

self.fc=nn.Linear(100,20)

defforward(self,input):

out=self.fc(input)

out=F.dropout(out,p=0.5)

returnout

Net=DropoutFC

Net.train

# train the Net

这段代码中的F.dropout实际上是没有任何用的, 因为它的training状态一直是默认值False. 由于F.dropout只是相当于引用的一个外部函数, 模型整体的training状态变化也不会引起F.dropout这个函数的training状态发生变化. 所以, 此处的out = F.dropout(out) 就是 out = out. Ref: https://github.com/pytorch/pytorch/blob/master/torch/nn/functional.py#L535

正确的使用方法如下, 将模型整体的training状态参数传入dropout函数

ClassDropoutFC(nn.Module):

def__init__(self):

super(DropoutFC,self).__init__

self.fc=nn.Linear(100,20)

defforward(self,input):

out=self.fc(input)

out=F.dropout(out,p=0.5,training=self.training)

returnout

Net=DropoutFC

Net.train

# train the Net

或者直接使用nn.Dropout (nn.Dropout实际上是对F.dropout的一个包装, 也将self.training传入了) Ref: https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/dropout.py#L46

ClassDropoutFC(nn.Module):

def__init__(self):

super(DropoutFC,self).__init__

self.fc=nn.Linear(100,20)

self.dropout=nn.Dropout(p=0.5)

defforward(self,input):

out=self.fc(input)

out=self.dropout(out)

returnout

Net=DropoutFC

Net.train

# train the Net

PyTorch 0.4.0版本去掉了Variable,将Variable和Tensor融合起来,可以视Variable为requires_grad=True的Tensor。其动态原理还是不变。

在获取数据的时候也变得更优雅:

使用loss += loss.detach来获取不需要梯度回传的部分。

或者使用loss.item直接获得所对应的python数据类型。

============================================================

以下为原回答:

算是动态图的一个坑吧。记录loss信息的时候直接使用了输出的Variable。

应该不止我经历过这个吧...

久久不用又会不小心掉到这个坑里去...

for data, label in trainloader:

......

out = model(data)

loss = criterion(out, label)

loss_sum += loss # <--- 这里

......

运行着就发现显存炸了

观察了一下发现随着每个batch显存消耗在不断增大..

参考了别人的代码发现那句loss一般是这样写 /(ㄒoㄒ)/~~

loss_sum += loss.data[0]

这是因为输出的loss的数据类型是Variable。

而PyTorch的动态图机制就是通过Variable来构建图。主要是使用Variable计算的时候,会记录下新产生的Variable的运算符号,在反向传播求导的时候进行使用。

如果这里直接将loss加起来,系统会认为这里也是计算图的一部分,也就是说网络会一直延伸变大~那么消耗的显存也就越来越大~~

总之使用Variable的数据时候要非常小心。不是必要的话尽量使用Tensor来进行计算...

包括数据的输入时候,如果“过早”把数据丢到Variable里面去,那么可能也会被系统视为网络的一部分。所以,要投入的时候再把数据丢到Variable里面去吧~

题外话

想更多感受动态图的话,可以通过Variable的grad_fun来观察到该Variable是通过什么运算得到的(前提是前面的Variable的required_grad置为True)。

大概是这样

>> z = x + y

>> z.grad_fn

out:

<AddBackward1 at 0x107286240>

扫描二维码推送至手机访问。

版权声明:本文由我的模板布,如需转载请注明出处。


本文链接:http://www.xswglasses.com/post/80199.html

分享给朋友:

“index跳转代码(css跳转代码)” 的相关文章

新店办理房产税需要什么资料(新房办房产证怎么收税)

新店办理房产税需要什么资料(新房办房产证怎么收税)

今天给各位分享新店办理房产税需要什么资料的知识,其中也会对新房办房产证怎么收税进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、交房产税需要带什么资料 2、...

介绍自己的大学校园(介绍自己的大学校园ppt免费)

介绍自己的大学校园(介绍自己的大学校园ppt免费)

本篇文章给大家谈谈介绍自己的大学校园,以及介绍自己的大学校园ppt免费对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、怎么介绍学校 2、介绍校园 校园简介 3、如何...

大学生求职简历模版word(大学生求职简历电子版模板)

大学生求职简历模版word(大学生求职简历电子版模板)

今天给各位分享大学生求职简历模版word的知识,其中也会对大学生求职简历电子版模板进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、简历模板word个人简历范本...

职高和职业学校有什么区别(职高学校和职业学校有什么区别)

职高和职业学校有什么区别(职高学校和职业学校有什么区别)

今天给各位分享职高和职业学校有什么区别的知识,其中也会对职高学校和职业学校有什么区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、职校和职高是一样的吗...

学生学校(学生学校买的保险有哪些保障)

学生学校(学生学校买的保险有哪些保障)

本篇文章给大家谈谈学生学校,以及学生学校买的保险有哪些保障对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、学生与学校协议书范本 2、学生在学校表现评语 3、学生在学...

电大是什么学校靠谱吗(电大怎么样)

电大是什么学校靠谱吗(电大怎么样)

本篇文章给大家谈谈电大是什么学校靠谱吗,以及电大怎么样对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、国家开放大学好不好 国家开放大学有什么优势 2、广州市广播电视大学...