43期《深入浅出Pytorch》课程 - Task01:PyTorch的安装和基础知识+前置知识打卡

在这里插入图片描述
在这里插入图片描述

1、Pytorch安装

由于之前使用过Pytorch,所以说不需要再重新下载,直接开始后续的基础知识
在这里插入图片描述

2、基础知识

由于之前学习过numpy系列,所以说对于Pytorch的理解会轻松很多。

2.1 张量(Tensor)

①创建tensor

import torch
x = torch.rand(4, 3) 
print(x)

和numpy差不多,随机生成4X3的矩阵

在这里插入图片描述
②全0矩阵

x = torch.zeros(4, 3, dtype=torch.long)
print(x)

和numpy里面的zeros也是一样的
在这里插入图片描述
由于之前系统学习过numpy并且参加过一些比赛,于是不在此赘述关于张量部分的知识,和numpy的基础很像,换个包名字就行(具体关于numpy的可以参考此链接https://blog.csdn.net/weixin_42198265/category_11063560.html?spm=1001.2014.3001.5482)
在这里插入图片描述

2.2 自动求导

在pytorch中,所有神经网络的核心是 autograd 包
①.backward()

  • torch.Tensor 是这个包的核心类。
  • 如果设置它的属性 .requires_grad 为 True,那么它将会追踪对于该张量的所有操作。
    -当完成计算后可以通过调用 .backward(),来自动计算所有的梯度
  • 这个张量的所有梯度将会自动累加到.grad属性。

注意:在 y.backward() 时,如果 y 是标量,则不需要为 backward() 传入任何参数;否则,需要传入一个与 y 同形的Tensor

②Function
Tensor 和 Function 互相连接生成了一个无环图 (acyclic graph),它编码了完整的计算历史。

  • 每个张量都有一个.grad_fn属性,该属性引用了创建 Tensor 自身的Function(除非这个张量是用户手动创建的,即这个张量的grad_fn是 None )。
from __future__ import print_function
import torch
# 手动创建张量->grad_fn返回结果是None
x = torch.randn(3,3,requires_grad=True)
print(x.grad_fn)

在这里插入图片描述

③requires_grad
.requires_grad - 默认的是False,如果不打开,就是False;如果打开就会显示True;最后的计算记录可以在.grad_fn中显示。

a = torch.randn(2, 2) # 缺失情况下默认 requires_grad = False
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)

在这里插入图片描述

2.3 梯度

反向传播:

  • 因为 out 是一个标量,因此out.backward()out.backward(torch.tensor(1.)) 等价

out.backward() -> 输出导数 d(out)/dx【微积分】

grad在反向传播过程中是累加的(accumulated),这意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零

# 设置tensor
x = torch.ones(2, 2, requires_grad=True)
y = x**2
z = y * y * 3
out = z.mean()

# 第一次梯度下降
out.backward()
print(x.grad)

# 不归0的梯度下降 - 梯度累加
out2 = x.sum()
out2.backward()
print(x.grad) # 进行累加

# 归0后的梯度下降 - 梯度从0开始
out3 = x.sum()
x.grad.data.zero_() # 将梯度归0
out3.backward()
print(x.grad)

在这里插入图片描述
由于如果是向量,是无法直接计算其梯度的,故而有一种方法是将向量传给 backward,再使用.grad方法。

先确定向量

x = torch.randn(3, requires_grad=True) # 随机得到一个1X3的矩阵
print(x)

y = x * 2 # 将矩阵进行两倍相乘
print(y)
i = 0 # 设置梯度参数-记录次数
while y.data.norm() < 1000:
    y = y * 2
    i = i + 1
print(y)
print(i)

输出:
tensor([ 0.1789, -1.4232, -0.9889], requires_grad=True)
tensor([ 0.3577, -2.8463, -1.9778], grad_fn=<MulBackward0>)
tensor([  183.1484, -1457.3232, -1012.6375], grad_fn=<MulBackward0>)
9

torch.autograd 不能直接计算完整的雅可比矩阵,但是如果我们只想要雅可比向量积,只需将这个向量作为参数传给 backward

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
输入:
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])

修改梯度参数
v = torch.tensor([0.1, 8.0, 0.00001], dtype=torch.float)
y.backward(v)
print(x.grad)
输出:
tensor([1.0240e+02, 8.1920e+03, 1.0240e-02])

2.4 并行计算

之前李弘毅老师的视频中说过,深度学习再一次爆火的一部分原因是,可以用GPU进行并行运算了,大大减少训练模型时间,但是由于自己电脑配置太低,cuda不太能用,之前试过没有成功。所以说一般使用GPU都在kaggle的平台里。
一周还有30多小时,是在不行还能用算力资源,一小时也比较便宜
在这里插入图片描述
对于并行运算,有一个李弘毅老师视频讲过,就类似下方这种(https://blog.csdn.net/weixin_42198265/article/details/126349359
在这里插入图片描述

3、前置知识打卡

对于前置知识这一块,由于之前接触过numpy和pytorch,所以说有些会的就不再记录了。
①!cat demo.py
这种就是可以直接在jupyter中运行py文件
②%timeit
计算时间-评估运行效率

def choose_sort(arr: list) -> list:
    length = len(arr)
    for i in range(length):
        min_idx = i
        for j in range(i, length):
            if arr[j] < arr[min_idx]:
                min_idx = j
        if min_idx != i:
            arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

import random
lst = [random.randint(1, 1000) for i in range(1000)]
%timeit choose_sort(lst)

输出:
32.6 ms ± 575 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

学习文档里面还写了一些对于文件的保存和读取,不过我一般都是用pd.read_csv那些,对于txt文件读取也是用的with open

以上就是task01的全部打卡,希望可以在datawhale的学习中,学的更好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bessie_Lee_gogogo

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值