第一关
注:
-
神经网络的起源和应用
- 起源:神经网络最早由心理学家和神经学家开创,目的是模拟生物神经系统对真实世界物体的交互反应。
- 应用:现代神经网络用于分类(如图像识别、文本分类)和数值预测(如股价预测、天气预测)等任务。
-
神经元模型
- 输入和权重:神经元接收来自其他神经元的输入信号,并通过带权重的连接进行传递。
- 阈值:输入值与神经元的阈值进行比较。
- 激活函数:比较结果通过激活函数处理以产生输出,激活函数决定了神经元是否激活。
-
激活函数
- 理想激活函数:阶跃函数,将输入映射为“0”或“1”,表示神经元的兴奋或抑制。
- 实际使用的激活函数:Sigmoid函数,因其连续性和可微性而被广泛使用。
-
感知机
- 结构:感知机由输入层和输出层组成,输出层是M-P神经元或阈值逻辑单元。
- M-P神经元模型:这个模型最早源于发表于1943年的一篇开创性论文。论文的两位作者分别是神经生理学家沃伦·麦克洛克(Warren McCulloch)和数学家沃尔特·皮茨(Walter Pitts),论文首次实现了用一个简单电路(即感知机)来模拟大脑神经元的行为。
- 功能:感知机是一种简单的神经网络模型,由输入层和输出层组成。输入层接收信号,输出层进行处理。感知机可以执行基本的逻辑运算,如与、或、非。
-
感知机学习规则:当预测错误时,会根据错误程度调整权重,学习率η控制调整幅度。
- 权重调整:根据输出误差调整权重,学习率为η(0到1之间的值)。
- 预测正确:如果预测正确,则权重不发生变化。
- 预测错误:如果预测错误,则根据错误程度调整权重。
- 感知机的局限性:在于它只能解决线性可分问题,即只能通过一条直线或超平面来区分数据。对于更复杂的问题,需要使用包含隐层的多层前馈神经网络,这些网络能够处理非线性问题。
- 结构:感知机由输入层和输出层组成,输出层是M-P神经元或阈值逻辑单元。
-
多层神经网络(简单来说,感知机是神经网络的基础,但能力有限,多层神经网络能解决更复杂的问题。)
- 隐层:输入层和输出层之间的层,可以解决非线性可分问题。
- 多层前馈神经网络:每层神经元与下层神经元全互连,没有同层或跨层连接。
-
神经网络的结构
- 层级结构:由输入层、隐层(可能多个)和输出层组成。
- 信号处理:输入层接收信号,隐层和输出层对信号进行加工处理。
Code:
# 导入库
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 5x5 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 5) #定义conv1函数的是图像卷积函数:输入为图像(1个频道,即灰度图),输出为 6张特征图, 卷积核为5x5正方形
self.conv2 = nn.Conv2d(6, 16, 5) #定义conv2函数的是图像卷积函数:输入为6张特征图,输出为16张特征图, 卷积核为5x5正方形
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16*5*5, 120) #定义fc1(fullconnect)全连接函数1为线性函数:y = Wx + b,并将16*5*5个节点连接到120个节点上。
# 任务1:根据网络结构图,定义网络最后两层
########## Begin ##########
self.fc2 = nn.Linear(120, 84) #定义fc2(fullconnect)全连接函数2为线性函数:y = Wx + b,并将120个节点连接到84个节点上。
self.fc3 = nn.Linear(84, 10) #定义fc3(fullconnect)全连接函数3为线性函数:y = Wx + b,并将84个节点连接到10个节点上。
########## End ##########
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square, you can specify with a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features
# 创建网络对象
net = Net()
# 打印网络结构
print(net)
卷积是一种数学运算,它在多个领域中都有应用,包括信号处理、图像处理和机器学习中的卷积神经网络(CNNs)。卷积的基本思想是将一个较小的函数(称为卷积核或滤波器)滑动遍历另一个函数(可以是信号、图像或数据集),在每个位置计算卷积核与函数的局部区域的乘积之和。
以下是卷积的一些关键点:
- 图像处理中的卷积:在图像处理中,卷积可以用来应用各种效果,如模糊、锐化或边缘检测。通过将一个小的矩阵(卷积核)滑动遍历图像的每个像素,并计算加权和,可以改变图像的局部特征。
- 卷积核:是一个小的矩阵,它在卷积过程中用于提取输入数据的特征。在CNNs中,卷积核的参数(权重和偏置)通过训练过程学习得到。
- 卷积神经网络(CNNs):在深度学习中,CNNs利用卷积层来自动和有效地提取图像特征。卷积层通过学习到的卷积核来提取输入图像的局部特征,这些特征随后被用于分类或其他任务。
-
卷积层(Convolutional Layer)
- 卷积层是CNN中用于提取图像特征的关键部分。
- 它使用卷积核(或滤波器)在输入图像上滑动,计算卷积核与图像的局部区域的点积,生成特征图(feature maps)。
-
池化层(Pooling Layer)
- 池化层用于降低特征图的空间尺寸,从而减少参数数量和计算量。
- 最常见的池化操作是最大池化(max pooling),它在一定区域内取最大值。
-
激活函数
- 在卷积层和池化层之后通常会跟一个激活函数,如ReLU(Rectified Linear Unit:f(x)=max(0,x))。
- 激活函数引入非线性,使得网络能够学习和模拟更加复杂的函数映射。
-
全连接层(Fully Connected Layer)
- 在多个卷积和池化层之后,CNN通常会有全连接层。
- 全连接层将卷积层提取的特征进行整合,用于最终的分类或其他任务。
-
权重共享(Weight Sharing)
- 卷积核的参数在整个输入图像上是共享的,这意味着无论卷积核在图像的哪个位置,都使用相同的权重。
-
偏差项(Bias)
- 卷积层和全连接层通常会有偏差项,用于控制激活的阈值。
-
步长(Stride)
- 步长定义了卷积核在输入图像上滑动的距离。
-
填充(Padding)
- 填充是在输入图像的边缘添加的零值或特定值,用于控制输出特征图的大小。
-
- 卷积操作:卷积操作涉及两个函数:输入函数(如图像或信号)和卷积核。卷积核与输入函数的局部区域进行卷积,产生输出函数。这个过程通常涉及翻转卷积核,然后将其与输入函数的局部区域对齐,计算点积。
- 多维卷积:除了一维信号处理,卷积也可以扩展到多维,如二维卷积用于图像处理,三维卷积用于视频或体积数据。
卷积是一种强大的工具,它在许多领域中都有广泛的应用,特别是在处理和分析具有空间或时间结构的数据时。
Conv2d:https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d
Linear: Pytorch nn.Linear的基本用法与原理详解 - 知乎 (zhihu.com)
Maxpool2d: torch.nn.MaxPool2d详解-CSDN博客
View: PyTorch中的view()函数用法示例及其参数详解_.view(-1)-CSDN博客
这段代码定义了一个简单的卷积神经网络(CNN)模型,用于图像识别或其他相关任务。
# 导入PyTorch库和相关的模块 import torch import torch.nn as nn import torch.nn.functional as F
- 导入了PyTorch框架,torch.nn模块包含构建神经网络所需的类,torch.nn.functional模块包含一些函数式的接口,用于实现激活函数、池化等操作。
- PyTorch 是由 Facebook 开发,基于 Torch 开发,从并不常用的 Lua 语言转为 Python 语言开发的深度学习框架,Torch 是 TensorFlow 开源前非常出名的一个深度学习框架,而 PyTorch 在开源后由于其使用简单,动态计算图的特性得到非常多的关注,并且成为了 TensorFlow 的 最大竞争对手。
class Net(nn.Module):
- 定义了一个名为Net的类,它继承自nn.Module,是构建任何神经网络的基类。
def __init__(self): super(Net, self).__init__()
- 定义了Net类的构造函数,super(Net, self).__init__()调用基类的构造函数。
self.conv1 = nn.Conv2d(1, 6, 5) #定义conv1函数的是图像卷积函数:输入为图像(1个频道,即灰度图),输出为 6张特征图, 卷积核为5x5正方形 self.conv2 = nn.Conv2d(6, 16, 5) #定义conv2函数的是图像卷积函数:输入为6张特征图,输出为16张特征图, 卷积核为5x5正方形 # an affine operation: y = Wx + b self.fc1 = nn.Linear(16*5*5, 120) #定义fc1(fullconnect)全连接函数1为线性函数:y = Wx + b,并将16*5*5个节点连接到120个节点上。 self.fc2 = nn.Linear(120, 84) #定义fc2(fullconnect)全连接函数2为线性函数:y = Wx + b,并将120个节点连接到84个节点上。 self.fc3 = nn.Linear(84, 10) #定义fc3(fullconnect)全连接函数3为线性函数:y = Wx + b,并将84个节点连接到10个节点上。
- 定义了第一个卷积层conv1,它将1个输入通道的图像转换为6个特征图,卷积核大小为5x5。
- 定义了第二个卷积层conv2,它将前一层的6个特征图转换为16个特征图,卷积核大小同样为5x5。
- 定义了一个全连接层fc1,它将来自第二个卷积层的输出(假设是16个特征图,每个特征图大小为5x5)展平后,连接到120个节点。
- 定义了第二个全连接层fc2,它将fc1的输出120个节点连接到84个节点。
- 定义了第三个全连接层fc3,它将fc2的输出84个节点连接到10个节点,通常这10个节点对应于分类任务中的10个类别。
def forward(self, x):
- 定义了forward函数,它是神经网络的前向传播函数,用于计算输入数据x通过网络后的输出。
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) x = F.max_pool2d(F.relu(self.conv2(x)), 2)
- 对第一个卷积层的输出应用ReLU激活函数,然后进行2x2的最大池化。
- 对第二个卷积层的输出应用ReLU激活函数,然后进行2x2的最大池化。
x = x.view(1, self.num_flat_features(x))
- 将池化层的输出展平为一维向量,以便输入到全连接层。
x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x))
- 对fc1全连接层的输出应用ReLU激活函数。
- 对fc2全连接层的输出应用ReLU激活函数。
x = self.fc3(x)
- 通过最后一个全连接层fc3,得到最终的输出。
return x
- 返回网络的输出。
def num_flat_features(self, x):
- 定义了一个辅助函数num_flat_features,用于计算输入x在全连接层之前需要展平的特征数。
确定全连接层的输入维度:全连接层的每个神经元都需要与前一层的所有激活值相连接。因此,必须知道前一层输出的激活值总数,以便设置全连接层的输入维度。
数据展平:在卷积神经网络中,卷积层和池化层的输出通常是二维或三维的张量(例如,二维特征图)。但在进入全连接层之前,这些多维张量需要被展平成一维向量,以匹配全连接层的输入要求。
计算特征总数:
num_flat_features
函数通过计算特征图的尺寸(不包括批处理维度)来确定展平后的特征总数。对于每个特征图,计算其宽度、高度和通道数的乘积,得到该特征图展平后的特征数。动态计算:由于卷积层和池化层可能会改变特征图的尺寸(例如,通过步长或填充),
num_flat_features
函数提供了一种动态计算特征总数的方法,而不需要硬编码。在代码的
forward
方法中,x.view(-1,
size = x.size()[1:] # all dimensions except the batch dimension
- 获取输入x的大小,除了批量维度外的所有维度。
num_features = 1 for s in size: num_features *= s return num_features
- 计算需要展平的总特征数,返回这个数值。
- 在这段代码中,
num_flat_features
函数的作用是计算经过卷积和池化操作后的二维特征图(feature map)展平(flatten)成一维向量后的特征总数。这个函数在全连接层(fully connected layer,也称为稠密层)之前是必需的,因为全连接层需要知道输入数据的维度。net = Net() print(net)
- 创建Net类的实例,即创建了神经网络对象。
- 打印神经网络对象的结构,这将显示网络的每一层及其参数。
第二关
任务描述
本关任务:了解前馈神经网络与反馈神经网络的区别,认识一种典型的反馈神经网络,完成右侧窗口内的单项选择题。
相关知识
前馈网络与反馈网络
前馈网络一般指前馈神经网络或前馈型神经网络。它是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层,数据正想流动,输出仅由当前的输入和网络权值决定,各层间没有反馈。包括:单层感知器,线性神经网络,BP神经网络、RBF神经网络等。
反馈网络,又称自联想记忆网络,输出不仅与当前输入和网络权值有关,还和网络之前输入有关。其目的是为了设计一个网络,储存一组平衡点,使得当给网络一组初始值时,网络通过自行运行而最终收敛到这个设计的平衡点上。包括 Hopfield、Elman、CG、BSB、CHNN 和 DHNN 等。反馈网络具有很强的联想记忆和优化计算能力,最重要研究是反馈网络的稳定性。
主要区别:
- 前馈神经网络各层神经元之间无连接,神经元只接受上层传来的数据,处理后传入下一层,数据正向流动;反馈神经网络层间神经元有连接,数据可以在同层间流动或反馈至前层。
- 前馈神经网络不考虑输出与输入在时间上的滞后效应只表达输出与输入的映射关系;反馈神经网络考虑输出与输入之间在时间上的延迟,需要动态方程来描述系统的模型。
- 前馈神经网络的学习主要采用误差修止法(如BP算法),计算过程一般比较慢,收敛速度也比较慢;反馈神经网络主要采用Hebb学习规则,一般情况下计算的收敛速度很快。
- 相比前馈神经网络,反馈神经网络更适合应用在联想记忆和优化计算等领域。
Hopfield 神经网络
Hopfield 是一种全连接型的神经网络,模拟生物神经网络的记忆机理。离散型 Hopfield 网络结构比较简单,在实际工程中应用广泛。 Hopfield 是一种单层反馈型非线性网络,每一个结点的输出均反馈到其他结点的输入,整个网络不存在自反馈。Hopfield 利用模拟电路实现了对网络结点的描述。
离散型 Hopfield 神经网络:Hopfield 最早提出的网络是二值神经网络,各神经元的激励函数为阶跃函数或双极值函数,神经元的输入、输出只取 {0,1} 或者 { -1,1} ,所以也称为离散型 Hopfield 神经网络 DHNN。在DHNN中,所采用的神经元是二值神经元;因此,所输出的离散值 1 和 0 或者 1 和 -1 分别表示神经元处于激活状态和抑制状态。
离散 Hopfield 神经网络 DHNN 是一个单层网络,有 n 个神经元节点,每个神经元的输出均接到其它神经元的输入。各节点没有自反馈。每个节点都可处于一种可能的状态(1 或 -1),即当该神经元所受的刺激超过其阀值时,神经元就处于一种状态(比如 1),否则神经元就始终处于另一状态(比如 -1)。
测试说明
完成右侧窗口内的单项选择题,平台会对你的结果进行测试。
开始你的任务吧,祝你成功!
Answer
1、C
2、A
3、D
4、D
5、D