PyTorch学习笔记(三:神经网络结构&&pytorch神经网络搭建)

PyTorch既可以看作是加入了GPU支持的numpy, 同时也可以看成一个拥有自动求导功能的强大的深度神经网络。

神经网络结构

标准网络

感知器

感知器是所有神经网络中最基本的,也是更复杂的神经网络的基本组成部分。 它只连接一个输入神经元和一个输出神经元。

前馈(Feed-Forward)网络

前馈网络是感知器的集合,其中有三种基本类型的层: 输入层、隐藏层和输出层。 在每个连接过程中,来自前一层的信号被乘以一个权重,增加一个偏置,然后通过一个激活函数。 前馈网络使用反向传播迭代更新参数,直到达到理想的性能。

卷积神经网络

图像具有非常高的维数,因此训练一个标准的前馈网络来识别图像将需要成千上万的输入神经元,除了显而易见的高计算量,还可能导致许多与神经网络中的维数灾难相关的问题。 卷积神经网络提供了一个解决方案,利用卷积和池化层,来降低图像的维度。 由于卷积层是可训练的,但参数明显少于标准的隐藏层,它能够突出图像的重要部分,并向前传播每个重要部分。 传统的CNNs中,最后几层是隐藏层,用来处理“压缩的图像信息”。

【输入层、卷积层、池化层、隐藏层、输出层】

 

pytorch神经网络搭建

可以使用torch.nn包构建神经网络。看到autogradnn取决于autograd定义模型并区分它们。一个nn.Module包含图层,一个forward(input)返回的方法output

在PyTroch框架中,如果要自定义一个Net,通常需要继承自nn.Module然后实现自己的layer。(设置梯度优化器、损失函数)

执行神经网络的流程:创建矩阵 -> 转换为变量 -> 设置神经网络 -> 进行训练

神经网络的典型训练过程如下:

  1. 定义具有一些可学习参数(或权重)的神经网络
  2. 迭代输入数据集
  3. 通过网络处理输入
  4. 计算损失(输出距离是正确的)
  5. 传播梯度回到网络的参数
  6. 更新网络的权重,通常使用简单的更新规则: weight = weight - learning_rate * gradien

计算图

计算图被定义为有向图,其中节点对应于数学运算。 计算图是表达和评估数学表达式的一种方式。(前向传播、反向传播)

例如,简单数学公式: p = x + y

绘制上述方程的计算图如下:

pytorch segnet网络 pytorch网络结构_python

例如等式:g = ( x + y ) ∗ z

pytorch segnet网络 pytorch网络结构_神经网络_02

nn.Module(模组)

在Pytorch编写神经网络,层结构和损失函数来自于torch.nn,所有的模型构建都是从这个基类 nn.Module继承的

这样建立了计算图,这个结构可以复用多次,每次调用就相当于用该计算图定义的相同参数做一次前向传播(这得益于Pytorch的自动求导功能),不需要自己编写反向传播。定义完模型后,通过nn包来定义损失函数,常见的损失函数都定义在了nn中,比如均方误差、多分类的交叉熵,以及二分类的交叉熵等。

import torch
import torch.nn.functional as F
import torch.nn as nn
from torch.autograd import Variable

import matplotlib.pyplot as plt

#unsqueeze函数创建一个维度是1的向量、linspace函数生成在-1到1之间的100个数
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim = 1)

y = x ** 2 + 0.2 * torch.rand(x.size())

x, y = Variable(x), Variable(y)

class Net(nn.Module):
#定义神经网络
    def __init__(self, n_feature, n_hidden, n_output):
    #初始化数组,参数分别是初始化信息,特征数,隐藏单元数,输出单元数
    #nn包中封装了Linear()函数,当bias为false时,图层不会学习附加偏差
        super(Net, self).__init__()
        self.hidden = nn.Linear(n_feature,n_hidden)
        #设置输入层到隐藏层的函数
        self.predict = nn.Linear(n_hidden,n_output)
        #设置隐藏层到输出层的函数

    def forward(self, x):
    #定义向前传播函数
        x = F.relu(self.hidden(x))
        out = self.predict(x)
        return out

net = Net(1, 10, 1)
print(net)

#设置学习率为0.5, 用随机梯度下降法优化神经网络的参数
opt = torch.optim.SGD(net.parameters(), lr = 0.5)
#设置损失函数为均方损失函数,用来计算每次的误差
lossfunc = nn.MSELoss()

for t in range(100):
#进行100次的优化
    prediction = net(x)
    loss = lossfunc(prediction, y)
    opt.zero_grad()
    #梯度清零
    loss.backward()
    opt.step()
    #梯度优化