【5】张量变形、张量的微分运算

数据、代码等相关资料来源于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记录其通过什么方法得到目前的张量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要努力的小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值