PyTorch 1

PyTorch (2021.09.10)

1. 基本概念

1.1 Tensor(张量)

操作与Numpy类似

#
x=torch.Tensor(5,3)
x=torch.rand(5,3)
y=x.numpy() #可以和numpy相互转化
z=torch.from_numpy(y)

#torch.tensor() 可以同时对array和numpy格式的数据进行处理
s = np.array([1,2,3,4])
a = [1,2,3,4]
torch.tensor([s,a])
#

1.2 Variable(变量)
**将Tensor转换成Variable可以将计算从CPU转移到GPU上 ** 这句话存在疑问,等我弄懂了再来更新。

Variable是Tensor的封装,每个Variable都有三个属性。
Varibale的Tensor本身的 .data ,对应Tensor的梯度 .grad,以及这个Variable是通过什么方式得到的 .grad_fn

import torch
from torch.autograd import Variable #导入variable
x = torch.rand(4)
x = variable(x,requires_grad = True)
y = x * 3
grad_variables = torch.Tensor([1,2,3,4])
y.backward(grad_variables)                   
x.grad

Backward函数

关于梯度变量和backward函数的具体意义可以参考

Pytorch中的自动求导函数backward()所需参数含义

对于y.backward()函数 即 下一步计算对于 y 的梯度,其中grad_Variables可以看作是对于求得梯度的 雅可比矩阵的一个加权。

x.grad()则即为计算对于上一个调用backward函数的变量求梯度。

总结
对于一个用pytorch计算的网络,首先需要通过向前传播,计算loss是否符合停止要求,否则将对于output的误差进行反向传播,output.backward(),此时任意步骤上的变量对于output求梯度函数为x.grad,并使用梯度下降使得误差降低,这也是一般神经网络的结构。



通过Pytorch实现一个两层的bp神经网络

通过对于iris数据集进行bp神经网络拟合

#导入相关包
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F

from sklearn.datasets import load_iris
from torch.autograd import Variable
from torch.optim import SGD
from sklearn.model_selection import train_test_split   #导入

#判断GPU是否可用
use_cuda = torch.cuda.is_available()
print("use_cuda:",use_cuda)

#导入数据集
iris = load_iris()
iris.keys()

#划分实验测试集
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.3,random_state = 0)

X_train,X_test,y_train,y_test = torch.FloatTensor(X_train),torch.FloatTensor(X_test),torch.LongTensor(y_train),torch.LongTensor(y_test)
X_train,X_test,y_train,y_test = Variable(X_train),Variable(X_test),Variable(y_train),Variable(y_test)

#forward
#继承Module,并重写forward过程
class Net(torch.nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(Net,self).__init__()
        self.hidden = torch.nn.Linear(n_feature,n_hidden)
        self.predict = torch.nn.Linear(n_hidden,n_output)
        
    def forward(self,x):
        x = F.sigmoid(self.hidden(x))
        x = self.predict(x)
        out = F.log_softmax(x,dim = 1)
        return out

net = Net(4,5,4)

optimizer = SGD(net.parameters(),lr = 0.5)

for i in range(1000):
    prediction = net(X_train)
    loss = F.nll_loss(prediction,y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()     #优化器更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值