Handsome_zhou 发表于 2022-10-10 23:53:47

pytorch中的Variable()

本帖最后由 Handsome_zhou 于 2022-10-11 00:00 编辑

#torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现
#Variable包含三个属性:
#    data: 存储了Tensor, 是本体的数据
#    grad: 保存了data的梯度,本事是个Variable而非Tensor, 与data形状一致
#    grad_fn: 指向Function对象,用于反向传播的梯度计算只用
import torch
from torch.autograd import Variable

x = Variable(torch.ones(2,2), requires_grad = True)

y = x + x + x + x #Variable的运算结果也是Variable,但是中间结果反向传播中不会被求导。

y = x.sum()

y#其实查询的是x.data, 是个tensor。
"""
    Variable containing:
    4
   
"""


y.grad_fn # 目标函数的.grad_fn方法,它用来求梯度

"""
    <SumBackward0 at 0x18bcbfcdd30>
"""


y.backward() # 反向传播
x.grad#Variable的梯度保存在Variable.grad中
"""
    Variable containing:
    11
    11
   
"""


#grad属性保存在Variable中, 新的梯度下来会进行累加,再次求导后结果变成了2
y.backward()
x.grad # 可以看到变量梯度是累加的
"""
    Variable containing:
    22
    22
"""


#所以梯度要归零   在模型训练时直接优化器梯度清零, optimizer.zero_grad()
x.grad.data.zero_() # 归零梯度, 注意, 在torch中所有的Inplace操作都是要带下划线的,所以就没有.data.zero()方法

"""
    00
    00
   
"""



#对比Variable和Tensor的接口,相差无两
x = Variable(torch.ones(4, 5))

y = torch.cos(x) # 传入Variable
x_tensor_cos = torch.cos(x.data) # 传入Tensor

print(y)
print(x_tensor_cos)

"""
    Variable containing:
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
   
   
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
    0.5403, 0.5403, 0.5403, 0.5403, 0.5403
   
"""

chentyping 发表于 2022-10-11 08:22:11

什么时候出一种语言一统江湖就好了。

zxynb 发表于 2023-11-17 17:07:18

牛逼,大佬
页: [1]
查看完整版本: pytorch中的Variable()