【研究生随笔】Pytorch中的多层感知机
一个深度网络,每一层都与上面一层和下面一层完全相连。
上面就是一个多层感知机MLP(multilayer perceptron)出现了一个隐藏层,先介绍一下隐藏层:
隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分。(意思就是在输入层中输入的数据特征不能很好的线性表示或者不能被输出层很好的进行处理,所以隐藏层就要将这些不好处理的特征进行加工,使模型能够更好地线性划分不同类型的数据。)
通过矩阵X ∈R^(n×d) 来表⽰n个样本的小批量,其中每个样本具有d个特征。对于具有h个隐藏单元的单隐藏层多层感知机,⽤H ∈R^(n×h 表⽰隐藏层的输出,称为隐藏表⽰(hidden representations)。H也被称为隐藏层变量(hidden-layer variable)或隐藏变量(hidden variable)。因为隐藏层和输出层都是全连接的,所以需要有隐藏层权重W^((1)) ∈ R^(n×h 和隐藏层偏置b^((1)) ∈ R^(n×h 以及输出层权重W^((2)) ∈ R^(hq) 和输出层偏置b^((2)) ∈ R^(1×q) 。所以按如下⽅式计算单隐藏层多层感知机的输出O ∈ R^(n×q):
通用近似定理:
多层感知机可以通过隐藏神经元捕捉到各个输⼊之间复杂的相互作⽤,这些神经元依赖于每个输⼊的值。并且可以很容易地设计隐藏节点来执⾏任意计算。例如,在⼀对输⼊上进⾏基本逻辑操作。多层感知机是通⽤近似器,即使是⽹络只有⼀个隐藏层,给定⾜够的神经元(⾮常多)和正确的权重,就可以对任意函数建模。
激活函数:
激活函数通过计算加权和并加上偏置来确定神经元是否应该被激活。它们是将输⼊信号转换为输出的可微运算。⼤多数激活函数都是⾮线性的。(几乎所有深度神经网络模型都需要有激活函数)
多层感知机在输出层和输⼊层之间增加⼀个或多个全连接的隐藏层,并通过激活函数转换隐藏层的输出
ReLU(Rectified linear unit(线性整流单元))函数:
提供了一种简单的非线性变换,组要思想也挺简单的:(通过将相应的激活值设为0来仅保留正元素并丢弃所有负元素)要么让参数消失(负值),要么让参数通过(正值),使得优化表现得更好。
sigmoid函数:
对于⼀个定义域在R中的输⼊, sigmoid函数将输⼊变换为区间(0, 1)上的输出。因此, sigmoid通常称为挤压函数(squashing function)一般用于将输出视为二分类问题的概率的问题中。
tanh函数:
跟sigmoid类似,也是将也能将其输⼊压缩转换到区间(-1, 1)上。
多层感知机:
主要用到torch包和其中包含的nn(神经网络)包。
import torch as torch
from torch import nn as nn
from d21 import torch as d21
开始准备工作,设置批量数据集的大小和导入数据集
batch_size=256
train_iter, test_iter = d21.load_data_fashion_mnist(batch_size)
初始化模型参数
#初始化极型中的各个密数
num_inputs, num_outputs, num_hiddens = 784, 10, 256
W1 = nn.Parameter(
torch.randn