一、层
1、单一输出神经网络
2、多个输出神经网络(利用矢量化算法来描述)
3、对于多层感知机而言,整个模型接受原始输入(特征),生成输出(预测),并包含一些参数(所有组成层的参数集合)。同样,每个单独的层接收输入(由前一层提供)生成输出(到下一层的输入),并且具有一组可调参数,这些参数根据从下一层反向传播的信号进行更新。
二、块
1、虽然你可能认为神经元、层和模型为我们的业务提供了足够的抽象,但事实证明,我们经常发现谈论比单个层大但比整个模型小的组件更方便。
2、为了实现这些复杂的网络,我们引入了神经网络新概念——块。快可以描述单个层,由多个层组成的组件或整个模型本身。使用块进行抽象的一个好处是可以将一些块组合成更大的组件
3、从编程的角度来看,块由类(class)表示。它的任何子类都必须定义一个将其输入转换为输出的正向传播函数,并且必须存储任何必需的参数。注意,有些块不需要任何参数。最后,为了计算梯度,块必须具有反向传播函数。(反向传播函数由系统自动实现,我们只需要考虑正向传播函数和必需的参数)
三、多层感知机的简单实现
1、下面的代码生成如下网络,其中包含一个具有256个单元和ReLU激活函数的全连接的隐藏层,然后是一个具有10个单元且不带激活函数的全连接的输出层
import torch from torch import nn from torch.nn import functional as F # 可以发现层的执行顺序是作为参数传递的 # 实例化nn.Sequential构建模型 net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10)) X = torch.rand(2, 20) # net(X)其实是在运行net.__call__(X) net(X)
2、nn.Sequential
定义了一种特殊的Module
,即在PyTorch中表示一个块的类。它维护了一个由Module
组成的有序列表。
3、注意,两个全连接层都是Linear
类的实例,Linear
类本身就是Module
的子类。
4、正向传播(forward
)函数:它将列表中的每个块连接在一起,将每个块的输出作为下一个块的输入。
四、块的自定义实现
1、每个块的基本功能
2、下面代码构建了一个块,包含一个多层感知机,其具有256个隐藏单元的隐藏层和一个10维输出层。下面实现的MLP类继承了表示块的类,实现大部分依赖于父类,只需要提供构造函数和正向传播函数。
# 建立新的块,只需要实现新的构造函数和正向传播函数就行 class MLP(nn.Module): # 用模型参数声明层。这里,我们声明两个全连接的层 def __init__(self): # 调用`MLP`的父类`Block`的构造函数来执行必要的初始化。 # 这样,在类实例化时也可以指定其他函数参数,例如模型参数`params`(稍后将介绍) super().__init__() #实例化隐藏层 self.hidden = nn.Linear(20, 256) #实例化输出层 self.out = nn.Linear(256, 10) # 定义模型的正向传播,即如何根据输入`X`返回所需的模型输出 def forward(self, X): # 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。 # 只对隐藏层调用ReLU激活函数 return self.out(F.relu(self.hidden(X)))
print(X) net = MLP() # 每个模型最后有10个输出 net(X)
#输出结果
原文:https://www.cnblogs.com/xiaoqing-ing/p/15081238.html