PyCharm官网,点开看到有Professional(专业版)和Community(社区版)两个版本,后者是免费的,直接点击Community之下的Download下载安装包。
路径自己修改,下图浅选一下,其他一路next。
安装成功:
除此之外还应该安装anaconda和Python
这里曾经安装过anaconda,似乎anaconda的版本并不影响全局其他工具的安装,应该是随便找个教程就行。
Python也是曾经安装过的,根据后续步骤观察可能版本不同有一定影响,但很小,先不管它。
查看PyCharm是否可以正常使用,首先打开PyCharm,然后new project
默认就有一个py文件为main.py,浅试一下输出。
成功输出,PyCharm安装完成。
(除此之外还安装了Python对应的MySQL驱动,但感觉目前也用不上,详情请见此处)
找到适合计算机的CUDA版本
(此表至关重要,尤其在使用的计算机素质并没有那么好的情况下,请先对照表格找到适合计算机的cuda版本)
打开Pytorch官网,找到对应可以使用的Pytorch版本。
例如cuda9.0最高能够使用的Pytorch是v1.1.0,同时这里还有记录torchvision,一并记下来。
Pytorch安装教程海一样多,有很多是直接修改.condarc文件为清华镜像源,去掉-default,命令中去掉-c pytorch绕过官网从Anaconda Prompt中来下载,这里并不推荐(失败了n次泪的教训),我最后选择的是镜像源+Pytorch官网直接寻找对应版本下载。
根据刚刚找到并记录下来的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版本是可以下载复数个的,到时候根据需要选择)
在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
根据在Pytorch官网找到的对应版本,通过pip命令进行下载,找到刚刚找到的适合版本的whell下如图
将上下拼接起来,从这里获取pip指令,在Anaconda Prompt中执行,并等待下载完成
如果出现下载过慢的情况,也许可以尝试科学上网
pip install torch==1.1.0 torchvision==0.3.0 -f https://download.pytorch.org/whl/cu90/torch_stable.html
python
import torch
print(torch.cuda.is_available())
注:退出代码编译状态输入exit()即可,属于基操,我给忘了,特地标注一下
详情可见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函数:
使用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