pytorch一些容易忘记的语法
创建long类型的数据,具体有多少种类,可以参考pytorch官网给出的链接.
torch.zeros(5,3,dtype=torch.long)
torch.zeros(5,3).long()
x.add_ 后面加了下划线,会改变原来x的值
如果张量只有一个元素,可以用.item()将值取出来,作为python的数值类型。大于等于两个以上,会报错
numpy的array和torch的tensor共享底层的存储空间,一个被改变,另一个随之被改变
转换关系如下所示:
x = torch.rand(2)
x.numpy()
----------------------
x = np.rand(2)
x = np.random.rand(2)
torch.from_numpy(x)
torch.Tensor是整个package中的核心类,如果将其属性.requires_grad设置为True,它将追踪在这个类上定义的所有操作。当代码要进行反向传播时,直接调用.backward()就可以自动计算梯度。在这个Tensor上所有的梯度将会被累计进.grad属性中。
如果想终止一个Tensor在计算图中的追踪回溯,只需要执行.detach()就可以将该Tensor从计算图中撤下,在未来的回溯计算中也不会计算该Tensor。
除了.detach(),如果想终止对计算图的回溯,也可以采用with torch.no_grad()这种形式
Function类和Tensor类是同等重要的核心类,它和Tensor类共同构成了一个完整的类。每一个Tensor拥有.grad_fn属性,代表引用具体哪个Function创建了该Tensor。如果某个Tensor是用户自定义的,那么其对应的grad_fn is None
.grad:属性值
.grad_fn:这一步的运算使用了什么函数
requires_grad:是否加入计算图
(以上三个是autograd中最重要的三个量)
X1 = torch.ones(3,3)
print(X1)
x = torch.ones(2,2,requires_grad=True)
print(x)
y = x + 2
print(y)
print(x.grad_fn)
print(y.grad_fn)
--------------------
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
None
<AddBackward0 object at 0x000002DA049D80F0>
.requires_grad_():该方法可以原地改变Tensor的属性,如果没有默认为False
a = torch.rand(2,2)
a = (a*3)/(a-1)
print(a.requires_grad)
a.requires_grad_(True) # 注意,这里后面有个下划线
print(a.requires_grad)
b = (a*a).sum()
print(b.grad_fn)
-------------------
False
True
<SumBackward0 object at 0x000002DA0656FDA0>
如何比较两个张量完全相同
x = torch.ones(2,2)
y = torch.ones(2,2)
x.eq(y).all()
--------------------
tensor(True)
初始化权重
def init_weight(self):
initrange = 0.5
# embedding,fc层参数服从均匀分布。一开始如果都是初始化为全0的,比较难以训练
self.embedding.weight.data.uniform_(-initrange, initrange)
self.fc.weight.data.uniform_(-initrange, initrange)
# 偏置项初始化为0
self.fc.bias.data.zero_()