多层感知机(MLP)——深度学习
·
1.感知机
1.1 什么是感知机
感知机是一种最简单的人工神经网络模型,它模拟了生物神经元的工作原理,基本结构是单个神经元,接收多个输入信号,将每个输入乘以对应的权重,求和后加上偏置,再经过一个激活函数处理输出结果。
数学模型可以表示为:
,
其中 是输入值,
是权重,
是偏置,
是激活函数,常见的激活函数如修正线性单元(Rectified linear unit,ReLU)。

1.2 感知机的局限性
感知机只能处理线性可分的数据,即可以用一条直线(二维空间)或者一个超平面(高维空间)将不同类别的数据完全分开。面对像异或(XOR)这样简单的非线性可分问题时,单一的感知机模型就无法正确分类。

观察图中的数据点,绿色点 (0,0) 和 (1,1) 属于一类,红色点 (0,1) 和 (1,0) 属于另一类。如果尝试用一条直线(超平面)来划分这些点,会发现无论怎样画直线,都无法将绿色点和红色点完全分开。例如,一条水平直线会把 (0,0) 和 (0,1) 分错;一条垂直直线会把 (0,0) 和 (1,0) 分错;而一条斜直线也无法同时将两类点正确分开。这是因为异或问题的数据在二维空间中是线性不可分的,而感知机只能处理线性可分的数据。
2.多层感知机
2.1 什么是多层感知机
多层感知机是在感知机基础上发展而来,它包含多个神经元层,典型结构有输入层、一个或多个隐藏层以及输出层 。隐藏层的神经元可以自动提取输入数据的复杂特征,使得模型能够处理线性不可分的复杂数据模式。每一层神经元都把前一层的输出当作输入,进行加权求和与激活函数运算,逐步转换数据的表征。
2.2 多层感知机的优势
由于存在多个隐藏层,多层感知机可以拟合任意复杂的非线性函数,只要隐藏层神经元数量足够多。这使其广泛应用于图像识别、语音识别、自然语言处理等众多领域,是深度学习早期非常重要的模型架构。

2.3 多层感知机的应用
一、图像识别
- 物体识别
- 在安防监控领域,多层感知机可以对监控视频中的物体进行识别,比如识别出人员、车辆、动物等。它通过对大量带有标注的图像数据进行学习,提取出图像中的特征,进而判断图像中的物体类别。
- 在电子商务中,用于商品图片的分类和识别。例如,识别服装图片中的款式、颜色等,帮助用户快速找到想要的商品。
- 人脸识别
- 多层感知机可以对人脸图像进行特征提取和识别。在门禁系统中,通过对人脸图像的分析,判断是否为授权人员,从而决定是否开启门禁。
- 在社交媒体应用中,用于自动识别照片中的人物,方便用户进行照片的分类和管理。
二、语音识别
- 语音指令识别:在智能语音助手(如 Siri、小爱同学等)中,多层感知机用于识别用户发出的语音指令。它将音频信号转换为特征向量,然后通过多层感知机对这些特征进行处理,判断用户的意图,例如是查询天气、播放音乐还是设置闹钟等。
- 语音转文字:在语音输入法和会议记录等场景中,多层感知机可以将输入的语音信号转换为文字内容。它通过对大量语音数据和对应的文字标注进行学习,不断优化模型,提高语音转文字的准确率。
三、自然语言处理
- 文本分类:在新闻媒体行业,多层感知机可以对新闻文章进行分类,如将新闻分为政治、经济、体育、娱乐等类别。它通过对新闻文本的词向量表示进行处理,学习文本中的语义特征,进而做出分类判断。
- 情感分析:在社交媒体监测和产品评论分析中,多层感知机可以分析用户发布的文本内容的情感倾向,判断是正面、负面还是中性。例如,分析消费者对某一产品的评论,帮助企业了解产品的口碑。
四、医疗领域
- 疾病诊断:在医学影像(如 X 光、CT、MRI 等)分析中,多层感知机可以辅助医生进行疾病诊断。例如,对肺部 CT 影像进行分析,判断是否存在肿瘤等病变。
- 药物研发:在药物研发过程中,多层感知机可以对化合物的结构和活性数据进行分析,预测化合物的药理活性,辅助筛选有潜力的药物分子。
3.代码实现
import torch
from torch import nn
from d2l import torch as d2l
#定义了批量大小为 256
batch_size = 256
#Fashion-MNIST数据集,该函数返回训练集和测试集的数据迭代器,Fashion-MNIST是一个包含10类时尚物品图像的数据集,常用于图像分类任务
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
net = nn.Sequential(nn.Flatten(), # 将输入数据展平为一维,长度为784
nn.Linear(784, 256), #将输入从784维映射到256维
nn.ReLU(), #激活函数,引入非线性特征
nn.Linear(256, 10)) #将输入从256维映射到10维,对应Fashion-MNIST的10个类别
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01) #初始化线性层的权重,它使用正态分布初始化权重,标准差为0.01
#将init_weights函数应用到网络中的每个线性层
net.apply(init_weights)
#计算每个图像的损失
loss = nn.CrossEntropyLoss(reduction='none')
#定义训练轮数和学习率
num_epochs, lr = 10, 0.1
#使用随机梯度下降(SGD)优化器
updater = torch.optim.SGD(net.parameters(), lr=lr)
#迭代地执行前向传播、计算损失、执行反向传播,并使用优化器更新模型参数
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
d2l.plt.show()
#输出每个样本的预测结果
d2l.predict_ch3(net, test_iter)
d2l.plt.show()
结果


更多推荐
所有评论(0)