pytroch的一点使用心得
2018-03-13 13:44
411 查看
目录
目录pytroch的一些注意点
Tensor和Variable的区别
backward的使用
pytroch的一些注意点
pytorch是一个很方便的深度框架,上手简单,不过也有一些需要注意的点:Tensor和Variable的区别
backward的使用
Tensor和Variable的区别
-Tensor只是一个类似与
Numpy的矩阵块,我们可以用
Tensor作为
Numpy的代替。 比
Numpy相比如果使用的是gpu版的pytorch,则我们可以选择把
Tensor存在显卡上,使用
.cuda的办法。
-
Variable不仅封装了
Tensor作为对应的激活值,还保存了产生这个
Variable的 计算图,确保之后的自动求导可行。
- 具体可以参考这篇pytorch如何构建计算图
- 用
Tensor构成的
Variable并不共享内存。
例如:
import torch from torch.autograd import Variable data = torch.randn(3, 4) Data = Variable(data, requires_grad=True) print(data) print(Data) """ -0.4764 -0.3905 0.7649 0.0500 2.2558 -0.6688 0.3069 -1.1182 0.0612 0.7757 0.9996 -0.2380 [torch.DoubleTensor of size 3x4] Variable containing: -0.4764 -0.3905 0.7649 0.0500 2.2558 -0.6688 0.3069 -1.1182 0.0612 0.7757 0.9996 -0.2380 [torch.DoubleTensor of size 3x4] """ Data = Data + Variable(torch.ones(3, 4)) print(data) print(Data) """ -0.4764 -0.3905 0.7649 0.0500 2.2558 -0.6688 0.3069 -1.1182 0.0612 0.7757 0.9996 -0.2380 [torch.DoubleTensor of size 3x4] Variable containing: 0.5236 0.6095 1.7649 1.0500 3.2558 0.3312 1.3069 -0.1182 1.0612 1.7757 1.9996 0.7620 [torch.DoubleTensor of size 3x4] """
backward的使用
-backward是
Variable用来计算梯度的方法。值得注意的是,如果
Variable本身是一个标量时,可以直接使用
Variable.backward()来获得所需要的导数。例如:
import torch from torch.autograd import Variable data = torch.randn(3, 4) Data = Variable(data, requires_grad=True) print(Data) """ Variable containing: 0.0291 -0.9512 2.1084 0.7745 -0.5678 1.6256 -0.1632 -0.0343 0.2082 1.8471 1.4175 -0.3341 [torch.FloatTensor of size 3x4] """ print(Data.grad) """ None """ F = torch.mean(Data + Variable(torch.ones(3, 4))) F.backward() print(Data.grad) """ Variable containing: 1.00000e-02 * 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 8.3333 [torch.FloatTensor of size 3x4] """
如果
Variable本身是非标量时,可以直接使用
Variable.backward(a)来获得所需要的导数(
a的大小和
Variable的大小一致)。例如:
import torch from torch.autograd import Variable data = torch.randn(3, 4) x = Variable(data, requires_grad=True) y = Variable(torch.randn(2, 3)) print(x) print(y) """ Variable containing: 0.2585 0.5968 -0.1272 -1.3166 -0.0830 -0.8735 0.1632 -1.0764 -0.5808 0.5057 0.1693 0.7596 [torch.FloatTensor of size 3x4] Variable containing: 0.6695 -1.6198 -0.5489 2.8908 0.1137 -0.7324 [torch.FloatTensor of size 2x3] """ print(x.grad) """ None """ loss = torch.mm(y, x) # torch.mm表示x与y做矩阵乘法,loss的shape为 2 * 4 loss.backward(torch.ones(2, 4)) print(x.grad) """ Variable containing: 3.5603 3.5603 3.5603 3.5603 -1.5061 -1.5061 -1.5061 -1.5061 -1.2813 -1.2813 -1.2813 -1.2813 [torch.FloatTensor of size 3x4] """
上述例子可以理解为得到的
loss与一个和
loss一样大小的全1的矩阵,做对应位置相乘最后相加得到一个标量之后在求导。这就化成第一种情况,所以也就可以理解为
loss在每个分量上的梯度。更多例子可见pytorch自动微分的几个例子
需要注意的一点,pytorch的
backward在使用过一次之后会把相关信息删除,所以每次构建的图只允许一次
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.如果要多次使用需要在
backward设置
retain_variables=True
最后需要注意一点,使用
Variable.backward()求
Variable的梯度的时候,
Variable.grad是累加。例子可见关于Gradient,所以每次完成后记得把梯度变回0,
Variable.grad.data.zero_()。
相关文章推荐
- 关于UILabel的一点使用心得
- 使用Gaps做手游服务器性能测试的一点心得
- C#使用Webbrowser的一点心得体会
- 使用Authentication的一点心得
- 简单jms连接池和一点使用心得
- MacBook安装Windows双系统及虚拟机的一点使用心得
- JMS(Jboss Messaging)的一点使用心得(三)Spring扩展应用-Security
- 使用Spring Boot Gradle 打war包的一点心得体会
- 关于使用git的一点心得体会
- Java各类IDE一点使用心得
- pyqt 学习基础 4 - creater的一点使用心得
- 每次记录一点Idea的使用心得
- Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得
- 使用RichTextBox的一点心得
- 使用Direction的include指令和errorPage的一点心得
- Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得
- 一点使用oracle net的心得
- myeclipse的一点使用心得-----加载数据库驱动
- 关于水晶报表使用的一点心得
- 使用Prototype的一点心得体会(二)