人工智能-作业1:PyTorch实现反向传播

目录

  • 安装PyCharm
  • 安装Pytorch
  • 使用Pytorch实现反向传播

安装PyCharm

PyCharm官网,点开看到有Professional(专业版)和Community(社区版)两个版本,后者是免费的,直接点击Community之下的Download下载安装包。
人工智能-作业1:PyTorch实现反向传播_第1张图片
路径自己修改,下图浅选一下,其他一路next。
人工智能-作业1:PyTorch实现反向传播_第2张图片
安装成功:
人工智能-作业1:PyTorch实现反向传播_第3张图片
除此之外还应该安装anacondaPython
这里曾经安装过anaconda,似乎anaconda的版本并不影响全局其他工具的安装,应该是随便找个教程就行。
Python也是曾经安装过的,根据后续步骤观察可能版本不同有一定影响,但很小,先不管它。

查看PyCharm是否可以正常使用,首先打开PyCharm,然后new project
人工智能-作业1:PyTorch实现反向传播_第4张图片
默认就有一个py文件为main.py,浅试一下输出。
人工智能-作业1:PyTorch实现反向传播_第5张图片
成功输出,PyCharm安装完成。
(除此之外还安装了Python对应的MySQL驱动,但感觉目前也用不上,详情请见此处)

安装Pytorch

  1. 找到自己对应的驱动版本
    人工智能-作业1:PyTorch实现反向传播_第6张图片
    (老旧轻薄本有些许丢人但能用就行)
    人工智能-作业1:PyTorch实现反向传播_第7张图片
    这里版本后面标的一串数字就是可以对应的驱动版本号了

  2. 找到适合计算机的CUDA版本

    (此表至关重要,尤其在使用的计算机素质并没有那么好的情况下,请先对照表格找到适合计算机的cuda版本)

    人工智能-作业1:PyTorch实现反向传播_第8张图片对应表格找到可以使用的CUDA,记下来。
    比如我这里,就可以看出388对应的是CUDA9.0

  3. 打开Pytorch官网,找到对应可以使用的Pytorch版本

    例如cuda9.0最高能够使用的Pytorch是v1.1.0,同时这里还有记录torchvision,一并记下来。
    人工智能-作业1:PyTorch实现反向传播_第9张图片Pytorch安装教程海一样多,有很多是直接修改.condarc文件为清华镜像源,去掉-default,命令中去掉-c pytorch绕过官网从Anaconda Prompt中来下载,这里并不推荐(失败了n次泪的教训),我最后选择的是镜像源+Pytorch官网直接寻找对应版本下载。

  4. 根据刚刚找到并记录下来的CUDA、Pytorch、torchvision,从清华镜像下载两个包。
    我这里记录下来的版本是:pytorch 1.1.0——cuda 9.0——torchvision 0.3.0
    对应下载 torchvision-0.3.0-py37_cu90_1.tar.bz2和pytorch-1.1.0-py3.7_cuda90_cudnn7_1.tar.bz2
    你可以根据你的需要进行选择和下载。
    (由这里可见最后用到的Python版本其实是python3.7,即使我曾经下载过3.9,python版本是可以下载复数个的,到时候根据需要选择)

  5. 在Anaconda Prompt中执行命令,安装这两个,为后续做准备。

    (filePath根据两个包所在地址进行修改,后续文件名根据你下载的文件进行修改)

conda create --name EnvName python=3.7
activate EnvName
conda install --offline filePath\torchvision-0.3.0-py37_cu90_1.tar.bz2
conda install --offline filePath\pytorch-1.1.0-py3.7_cuda90_cudnn7_1.tar.bz2
  1. 根据在Pytorch官网找到的对应版本,通过pip命令进行下载,找到刚刚找到的适合版本的whell下如图

    人工智能-作业1:PyTorch实现反向传播_第10张图片
    将上下拼接起来,从这里获取pip指令,在Anaconda Prompt中执行,并等待下载完成
    如果出现下载过慢的情况,也许可以尝试科学上网

pip install torch==1.1.0 torchvision==0.3.0 -f https://download.pytorch.org/whl/cu90/torch_stable.html
  1. 检查是否成功安装Pytorch,在Anaconda Prompt中执行命令,输出ture则为成功
python
import torch
print(torch.cuda.is_available())

人工智能-作业1:PyTorch实现反向传播_第11张图片
注:退出代码编译状态输入exit()即可,属于基操,我给忘了,特地标注一下

使用Pytorch实现反向传播

详情可见06 Pytorch实现反向传播_蓝子娃娃的博客-CSDN博客_pytorch反向传播
前向传播全程为y=w∗x+b进行计算的一个例子,每一次变换都为线性变换

import torch
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
# 权重初始值(设置w的初始值),在grad求导时会将这里设置的初始值带入
# Tensor创建时默认不计算梯度,需要计算梯度设置为ture,自动记录求w的导

# y_predict = x * w
def forward(x):
    return x * w
# 损失函数,return激活函数后得到的
def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

# 训练过程
# 第一步:先算损失Loss
# 第二步:backward,反向传播
# 第三步:梯度下降
for epoch in range(100):    #训练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.grad.data:获取梯度,用data计算,不会建立计算图,每次获取叠加到grad
        w.data = w.data - 0.01 * w.grad.data     # 修正一次w,learningrate=0.01(类似步长

        w.grad.data.zero_()     # 注意:将w中记录的梯度清零,消除本次计算记录,只保留新的w,开启下一次前向传播
    print("pregress:", epoch, l.item()) # item取元素精度更高,得到的是loss

梯度其实就是求导的过程,Pytorch的backward省略了将求导拆分再逐步计算的过程,直接对应w.requires_grad = True处,求w的导,并将其存入grad里。
也就是说谁对应了requires_grad=Ture,使用backward最后的求导就会落到谁这里。
//grad相关来自PyTorch Autograd自动求导_w3cschool
得到的结果(第100次):

grad: 1.0 2.0 -7.152557373046875e-07
grad: 2.0 4.0 -2.86102294921875e-06
grad: 3.0 6.0 -5.7220458984375e-06
pregress: 99 9.094947017729282e-13

我尝试使用非线性变换作为激活函数求得最终的loss,例如sigmoid函数:在这里插入图片描述人工智能-作业1:PyTorch实现反向传播_第12张图片

使用sigmoid函数作为激活函数,损失函数为MSE(均方方差),修改loss():


# 损失函数MES,激活函数sigmoid
def loss(x,y):
    h=forward(x)
    y_pred = torch.sigmoid(h)
    return 1/2*torch.sum((y_pred - y) ** 2)

但是总觉得得到的结果好像不那么对,因为sigmoid函数不知道怎么回事结果一直在单向变化,而且其他值看起来都挺不对劲的,算出的y好像也一直在正向增加甚至超过了应该停止在的值,研究一番无果,怎么看都觉得挺对的(捂脸) ,可能我对激活函数的理解有误……先放这儿吧懂了再来改。

但是如果损失函数想要使用MES用1/2*torch.sum((y_pred - y) ** 2)应该是对的。

所以,如果只运用MES

# 损失函数MES
def loss(x,y):
    y_pred = forward(x)
    return 1/2*torch.sum((y_pred - y) ** 2)

grad: 1.0 2.0 -7.152557373046875e-07
grad: 2.0 4.0 -2.86102294921875e-06
grad: 3.0 6.0 -5.7220458984375e-06
pregress: 99 1.8189894035458565e-12

——————————————————————
参考:
Anaconda+pycharm配置pytorch1.1.0+cuda 9.0+python3.7环境 - Hahallo - 博客园
06 Pytorch实现反向传播_蓝子娃娃的博客-CSDN博客_pytorch反向传播
pytorch实现反向传播 - 知乎
PyTorch Autograd自动求导_w3cschool

你可能感兴趣的:(人工智能,python,人工智能)