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)

pytorch学习实战第五篇:卷积神经网络实现MNIST手写数字识别

PyTorch深度学习

PyTorch 完全入门指南!从线性回归逻辑回归到图像分类

pytorch学习实战逻辑回归