总说
由于pytorch 0.4版本更新实在太大了, 以前版本的代码必须有一定程度的更新. 主要的更新在于 Variable和Tensor的合并., 当然还有Windows的支持, 其他一些就是支持scalar tensor以及修复bug和提升性能吧. Variable和Tensor的合并导致以前的代码会出错, 所以需要迁移, 其实迁移代价并不大.
Tensor和Variable的合并
说是合并, 其实是按照以前(0.1-0.3版本)的观点是: Tensor现在默认requires_grad=False的Variable了.torch.Tensor
和torch.autograd.Variable
现在其实是同一个类! 没有本质的区别! 所以也就是说,现在已经没有纯粹的Tensor了, 是个Tensor, 它就支持自动求导!你现在要不要给Tensor
包一下Variable
, 都没有任何意义了.
查看Tensor的类型
使用.isinstance()
或是x.type()
, 用type()
不能看tensor的具体类型.
> x = torch.DoubleTensor([1, 1, 1]) > print(type(x)) # was torch.DoubleTensor "<class 'torch.Tensor'>" > print(x.type()) # OK: 'torch.DoubleTensor' 'torch.DoubleTensor' > print(isinstance(x, torch.DoubleTensor)) # OK: True True
requires_grad 已经是Tensor的一个属性了
> x = torch.ones(1) > x.requires_grad #默认是False False > y = torch.ones(1) > z = x + y > # 显然z的该属性也是False > z.requires_grad False > # 所有变量都不需要grad, 所以会出错 > z.backward() RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn > > # 可以将`requires_grad`作为一个参数, 构造tensor > w = torch.ones(1, requires_grad=True) > w.requires_grad True > total = w + z > total.requires_grad True > # 现在可以backward了 > total.backward() > w.grad tensor([ 1.]) > # x,y,z都是不需要梯度的,他们的grad也没有计算 > z.grad == x.grad == y.grad == None True
通过.requires_grad()
来进行使得Tensor需要梯度.
不要随便用.data
以前.data
是为了拿到Variable
中的Tensor
,但是后来, 两个都合并了. 所以.data返回一个新的requires_grad=False的Tensor!然而新的这个Tensor
与以前那个Tensor
是共享内存的. 所以不安全, 因为
y = x.data # x需要进行autograd # y和x是共享内存的,但是这里y已经不需要grad了, # 所以会导致本来需要计算梯度的x也没有梯度可以计算.从而x不会得到更新!
所以, 推荐用x.detach()
, 这个仍旧是共享内存的, 也是使得y
的requires_grad为False,但是,如果x需要求导, 仍旧是可以自动求导的!
scalar的支持
这个非常重要啊!以前indexing一个一维Tensor
,返回的是一个number类型,但是indexing一个Variable
确实返回一个size为(1,)的vector.再比如一些reduction操作, 比如tensor.sum()
返回一个number
, 但是variable.sum()
返回的是一个size为(1,)的vector.
scalar
是0-维度的Tensor, 所以我们不能简单的用以前的方法创建, 我们用一个torch.tensor
注意,是小写的!
y = x.data # x需要进行autograd # y和x是共享内存的,但是这里y已经不需要grad了, # 所以会导致本来需要计算梯度的x也没有梯度可以计算.从而x不会得到更新!
从上面例子可以看出, 通过引入scalar
, 可以将返回值的类型进行统一.
重点:
1. 取得一个tensor的值(返回number), 用.item()
2. 创建scalar
的话,需要用torch.tensor(number)
3.torch.tensor(list)
也可以进行创建tensor
累加loss
以前了累加loss(为了看loss的大小)一般是用total_loss+=loss.data[0]
, 比较诡异的是, 为啥是.data[0]
"color: #ff0000">弃用volatile
现在这个flag已经没用了. 被替换成torch.no_grad()
,torch.set_grad_enable(grad_mode)
等函数
> x = torch.zeros(1, requires_grad=True) > with torch.no_grad(): ... y = x * 2 > y.requires_grad False > > is_train = False > with torch.set_grad_enabled(is_train): ... y = x * 2 > y.requires_grad False > torch.set_grad_enabled(True) # this can also be used as a function > y = x * 2 > y.requires_grad True > torch.set_grad_enabled(False) > y = x * 2 > y.requires_grad False
dypes,devices以及numpy-style的构造函数
dtype
是data types, 对应关系如下:
通过.dtype
可以得到
其他就是以前写device type
都是用.cup()
或是.cuda()
, 现在独立成一个函数, 我们可以
> device = torch.device("cuda:1") > x = torch.randn(3, 3, dtype=torch.float64, device=device) tensor([[-0.6344, 0.8562, -1.2758], [ 0.8414, 1.7962, 1.0589], [-0.1369, -1.0462, -0.4373]], dtype=torch.float64, device='cuda:1') > x.requires_grad # default is False False > x = torch.zeros(3, requires_grad=True) > x.requires_grad True
新的创建Tensor方法
主要是可以指定dtype
以及device
.
> device = torch.device("cuda:1") > x = torch.randn(3, 3, dtype=torch.float64, device=device) tensor([[-0.6344, 0.8562, -1.2758], [ 0.8414, 1.7962, 1.0589], [-0.1369, -1.0462, -0.4373]], dtype=torch.float64, device='cuda:1') > x.requires_grad # default is False False > x = torch.zeros(3, requires_grad=True) > x.requires_grad True
用 torch.tensor来创建Tensor
这个等价于numpy.array,用途:
1.将python list的数据用来创建Tensor
2. 创建scalar
# 从列表中, 创建tensor > cuda = torch.device("cuda") > torch.tensor([[1], [2], [3]], dtype=torch.half, device=cuda) tensor([[ 1], [ 2], [ 3]], device='cuda:0') > torch.tensor(1) # 创建scalar tensor(1)
torch.*like以及torch.new_*
第一个是可以创建, shape相同, 数据类型相同.
> x = torch.randn(3, dtype=torch.float64) > torch.zeros_like(x) tensor([ 0., 0., 0.], dtype=torch.float64) > torch.zeros_like(x, dtype=torch.int) tensor([ 0, 0, 0], dtype=torch.int32)
当然如果是单纯想要得到属性与前者相同的Tensor, 但是shape不想要一致:
> x = torch.randn(3, dtype=torch.float64) > x.new_ones(2) # 属性一致 tensor([ 1., 1.], dtype=torch.float64) > x.new_ones(4, dtype=torch.int) tensor([ 1, 1, 1, 1], dtype=torch.int32)
书写 device-agnostic 的代码
这个含义是, 不要显示的指定是gpu, cpu之类的. 利用.to()
来执行.
# at beginning of the script device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") ... # then whenever you get a new Tensor or Module # this won't copy if they are already on the desired device input = data.to(device) model = MyModule(...).to(device)
迁移代码对比
以前的写法
model = MyRNN() if use_cuda: model = model.cuda() # train total_loss = 0 for input, target in train_loader: input, target = Variable(input), Variable(target) hidden = Variable(torch.zeros(*h_shape)) # init hidden if use_cuda: input, target, hidden = input.cuda(), target.cuda(), hidden.cuda() ... # get loss and optimize total_loss += loss.data[0] # evaluate for input, target in test_loader: input = Variable(input, volatile=True) if use_cuda: ... ...
现在的写法
# torch.device object used throughout this script device = torch.device("cuda" if use_cuda else "cpu") model = MyRNN().to(device) # train total_loss = 0 for input, target in train_loader: input, target = input.to(device), target.to(device) hidden = input.new_zeros(*h_shape) # has the same device & dtype as `input` ... # get loss and optimize total_loss += loss.item() # get Python number from 1-element Tensor # evaluate with torch.no_grad(): # operations inside don't track history for input, target in test_loader: ...
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】