人工智能作业1:PyTorch实现反向传播
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、安装PyCharm,配置好python开发环境
1.配置环境变量:python下载地址
下载后,双击下载包,进入 Python 安装向导,安装非常简单,你只需要使用默认的设置一直点击"下一步"直到安装完成即可。(作者下载的python3.9.7)
安装好之后,进入高级系统设置,找到环境变量中的系统变量,然后再path中加入python的安装路径,使用win+R键打开命令提示符,输入python,若出现Python版本号则配置成功。
具体可参考:python环境配置|菜鸟教程
二、PyCharm 是一款功能强大的 Python 编辑器,具有跨平台性,下面进行PyCharm 安装:PyCharm 下载地址(推荐使用社区版Community,因为社区版是免费的)
具体安装和配置教程可参考:具体安装教程|菜鸟教程
注:教程中安装时第二步如出现如下界面,按下图勾选
安装和配置完成后,运行一个python程序验证:
如图,PyCharm安装成功!
三、安装pytorch
安装Anaconda:下载地址
安装后,进入Anaconda Prompt
输入conda create -n pytorch python=3.9.7,创建pytorch环境
输入activate pytorch进入创建的pytorch环境
找到.condarc这个文件(文件地址C:\Users\admin.condarc),将文件用记事本打开,删除原内容,将以下代码复制到文件中
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
ssl_verify: true
进入官网:pytorch下载地址
进行配置,配置如下
复制Run this Command中的地址(去掉 -c pytorch):
conda install pytorch torchvision torchaudio cudatoolkit=11.3
在环境中输入地址:
进行安装,安装后进入配置:
安装完成后在命令行输入python,之后再输入import touch,若无报错则安装完毕。
三、使用pytorch进行反向传播:
代码如下:
import torch
import numpy as np
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = torch.Tensor([1.0]) # 权重初始值
w.requires_grad = True # 是否需要计算梯度,Tensor创建之 后默认不计算梯度
# y_predict=x*w
def forward(x):
return x * w
def loss(x, y): # 损失函数
y_pred = forward(x)
return (y_pred - y) ** 2
# 训练过程
# 第一步:先算损失Loss
# 第二步: backward, 反向传播
# 第三步:梯度下降
for epoch in range(100):
for x, y in zip(x_data, y_data):
l = loss(x, y) # 前向传播,求Loss, 构建计算图
l.backward() # 反向传播,求出计算图中所有梯度存入w中
print("\tgrad:", x, y, w.grad.item())
w.data = w.data - 0.01 * w.grad.data # w.. grad. data:获取梯度,用data计算, 不会建立计算图
w.grad.data.zero_() # 注意:将w中所有梯度清零
print("pregress:", epoch, l.item())
结果如下(部分):
四、自动求导:
import torch
#①创建一个张量并设置requires_grad=True用来追踪其计算历史
x = torch.ones(2, 2, requires_grad=True)
print(x)
#②对这个张量做一次运算:②
y = x + 2
print(y)
print(y.grad_fn)#y是计算的结果,所以它有grad_fn属性
#③对y进行更多操作:
z = y * y * 3
out = z.mean()
print(z, out)
'''④.requires_grad_(...) 原地改变了现有张量的 requires_grad 标志。
如果没有指定的话,默认输入的这个标志是False'''
a = torch.randn(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)
'''⑤梯度,因为out是一个标量。所以让我们直接进行反向传播,
out.backward()和out.backward(torch.tensor(1.))等价'''
out.backward()
#输出导数d(out)/dx
print(x.grad)
结果:
①
②
③
④
⑤
计算过程实质就是一个标量函数对于各个分量求偏导数
详情参考:PyTorch Autograd自动求导_w3cschool