PyTorch学习第一个神经网络(回归与分类)
Posted My heart will go ~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyTorch学习第一个神经网络(回归与分类)相关的知识,希望对你有一定的参考价值。
第一个网络即将横空出世…
回归问题
import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
#生成一些伪数据
x=torch.unsqueeze(torch.linspace(-1,1,100), dim=1)#变成二维数据,因为只能处理二维数据
y=x.pow(2)+0.2*torch.rand(x.size()) #定义一个随机的y = a * x^2 + b
x,y=Variable(x),Variable(y)
class Net(torch.nn.Module):#继承torch的Module模块,
def __init__(self,n_feature,n_hidden,n_output):#搭建所需要的信息
super(Net,self).__init__() #继承 ——init——功能,官方步骤
#定义每一层,每一层都是这个模块的属性
self.hidden=torch.nn.Linear(n_feature,n_hidden) #隐藏层线性输出,n_hidden是神经元的个数
self.predict=torch.nn.Linear(n_hidden,n_output) #输出层线性输出
def forward(self,x):#前向传递的过程
#正向传播输入值,神经网络分析出输出值
x=F.relu(self.hidden(x))#隐藏层加工一下输入信息,然后激活以下
x=self.predict(x)#不用激励函数,因为预测的时候,值有可能被截断
return x
net=Net(1,10,1)#输入,隐藏层(神经元),输出
print(net) #查看net的结构
plt.ion()#实时打印的过程,
plt.show()
# optimizer 是训练的工具,优化神经网络
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)#传入net的所有参数,学习率
loss_function=torch.nn.MSELoss() #计算误差的手段,回归问题常用方差
for t in range(100): #训练的步数为100
prediction=net(x)
loss=loss_function(prediction,y)#预测值在前,真实值在后
#优化的步骤
optimizer.zero_grad()#梯度全部设置为0
loss.backward() #误差反向传播,计算参数更新值
optimizer.step() #参数更新值加到net的parameters上
if t % 5==0:
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
plt.ioff()
plt.show()
分类问题
与回归问题大同小异,框架基本一致,只不过要修改之前的数据,以及在输出结果的地方进行加工。
import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
n_data = torch.ones(100, 2)
x0 = torch.normal(2*n_data, 1) # normal:离散正太分布
y0 = torch.zeros(100) #
x1 = torch.normal(-2*n_data, 1) # 均值为-2,方差为1
y1 = torch.ones(100) #
#进行数据的合并
x = torch.cat((x0, x1), 0).type(torch.FloatTensor) # 两组数据合并到一起,浮点数类型
y = torch.cat((y0, y1), ).type(torch.LongTensor) # 标签也都合并到一起
x,y=Variable(x),Variable(y)
class Net(torch.nn.Module):#继承torch的Module模块
def __init__(self,n_feature,n_hidden,n_output):#搭建所需要的信息
super(Net,self).__init__() #继承 ——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.relu(self.hidden(x))
x=self.predict(x)
return x
net=Net(2,10,2)#因为数据包含两个特征,输入两个特征,10个神经元,输出两个分类值。多分类的例子
print(net) #查看net的结构
plt.ion()#实时打印的过程,
plt.show()
# optimizer 是训练的工具
optimizer=torch.optim.SGD(net.parameters(),lr=0.02)#传入net的所有参数,学习率
loss_function=torch.nn.CrossEntropyLoss() #分类问题中常用的
for t in range(100): #训练的步数为100
out=net(x)#输入数据x,得到对应的输出
loss=loss_function(out,y)#预测值在前,真实值在后
optimizer.zero_grad()#清空上一步的参与更新参数值
loss.backward() #误差反向传播,计算参数更新值
optimizer.step() #参数更新值加到net的parameters上
if t % 2==0:
plt.cla()
# 过了一道 softmax 的激励函数后的最大概率才是预测值
prediction = torch.max(F.softmax(out), 1)[1]#转换成概率,并取最大值
pred_y = prediction.data.numpy().squeeze()
target_y = y.data.numpy()
plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn')
accuracy = sum(pred_y == target_y)/200. # 预测中有多少和真实值一样
plt.text(1.5, -4, 'Accuracy=%.2f' % accuracy, fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
plt.ioff()
plt.show()
现在看来好复杂,慢慢学吧。。。奥利给,,,
以上是关于PyTorch学习第一个神经网络(回归与分类)的主要内容,如果未能解决你的问题,请参考以下文章
PyTorch深度学习——逻辑斯蒂回归(分类问题)(B站刘二大人P6学习笔记)
pytorch学习笔记:逻辑斯蒂回归(Logistic Regression)