数据、代码等相关资料来源于b站日月光华老师视频,此博客作为学习记录。
一、张量变形
张量变形的一个前提条件是元素个数必须是相等的。例如一个4×6的共24个元素的tensor,它再变化也得元素一共是24的,不可能变成5×5的tensor。
变形方法:.view()
- 变形示例
t = torch.randn(4, 6)
print(t)
t1 = t.view(3,8)
print(t1)
- 自动计算的变形
t2 = t.view(-1, 1)
# -1意为自动计算,1意为第二个维度为一维。即使第二维为1时,让前面的维度自动计算
print(t2)
- 多维展平示例
# 假设读入的特征图4维,想让后面3维展平
t = torch.randn(12, 3, 4, 4)
t1 = t.view(12, 3*4*4)
print(t1.shape)
可见其从四维变成二维。
- 维度的增加和删除
# 假设读入的特征图4维,想让后面3维展平
t = torch.randn(12, 48)
# 增加维度
t1 = t.view(1, 12, 48)
print(t1.shape)
# 删除维度
t2 = torch.squeeze(t1)
print(t2.shape)
# 注意.squeeze方法删除的是其中维度为1的维度
二、张量的自动微分
# requires_grad就代表着pytorch会开始追踪t的计算
t = torch.ones(2, 2, requires_grad=True)
y = t + 5
print(y)
print(y.grad_fn)
# 这里y后面出现了grad_fn的属性,是得到此张量的方法
# 并且y也会继承requires_grad的属性
继续计算:
z = y*2
out = z.mean()
print(out)
得到的out的结果,仍然是有requires_grad的属性,且说明得到out的方法是mean。得到的out的结果是一个维度为0的标量值,可以调用自动微分。
out.backward()
print(t.grad) # grad属性记录计算得到的梯度
# 以数学公式来看可表示为d(out)/dt
- 不需要跟踪梯度时
(1)当某些地方不需要跟踪梯度时:
# 如果一些计算不需要跟踪其梯度,可以使用一下方法:
with torch.no_grad():
y1 = t * 2
print(y1.grad_fn)
打印的结果就是:
(2) 截断梯度
t = torch.ones(2, 2, requires_grad=True)
y = t + 5
z = y*2
out = z.mean() # 还是刚才的计算
result = out.detach() # 使用.detach()对梯度截断
print(result.grad_fn)
resul的梯度:
总结:
tensor的三个属性:
data是其tensor值,grad记录其梯度值,grad_fn记录其通过什么方法得到目前的张量。