一.实验前的准备

1.神经网络

1.1神经网络梗概:

神经网络是机器学习中的“万能拟合器”,专门解决传统的算法(模型)解决不了的问题。

1.2传统算法和神经网络的区别

传统算法:只能通过人工设计好的特征去总结简单的规律。(eg.房价预测,鸢尾花分类......)

神经网络:图片,文本,语音都能处理(根据图片判断人,根据文本理解语义,根据语音分辨语气)无需人工给出特征,自己去学习特征,总结规律,最后完成分类,预测等工作,解放双手!

这些规律非常复杂,非线性,高纬度

1.3神经网络的作用

1.3.1形象的比喻:一层一层提取特征的黑盒子

1.3.2

输入:原始数据(图像,音频,文本......)

中间的许多层:自动学习关键特征(图像:边缘->纹理->形状->物体,文本:字->词->语义->情感),一层比一层学的深

输出:结果(分类,预测,生成)

1.3.3核心作用

①拟合任意复杂函数:数学上已经证明:足够深的神经网络可以逼近任何连续函数

②自动特征提取,无需人工

③处理高维、非结构化数据

④端到端学习,输入原始数据 → 直接输出结果,中间不用人工拆分步骤。

1.4总结

现实世界大部分问题都很复杂

传统模型能力有限,搞不定图像、语音、自然语言

神经网络是目前最强、最通用的复杂模式识别工具

2.卷积神经网络

2.1卷积

2.1.1卷积的定义

用一个 “小模板” 在数据上滑动,每滑到一个位置就做一次加权求和,把结果当成新值

2.1.2卷积的作用

提取特征、平滑、模糊、边缘检测等。

平滑/模糊的作用:去掉图像(数据)中的噪声(脏数据),他们不是图像的特征,模糊他们后提取的特征才准确

边缘检测:平滑模糊后才能边缘检测,找到物体的边界

2.1.3总结

卷积 = 滑动模板 + 加权求和

2.2卷积层-全连接层

2.2.1层的功能

卷积层:提取图像特征(边缘-纹理-形状-物体)(学习层)

池化层:压缩信息,保留重点(总结出关键规律)

全连接层:做出最后判断

2.2.2层的特点

①卷积层:

只看局部区域,不看整张图

权重共享:一个探测器扫遍全图,参数很少

输出是特征图(feature map),保留空间位置信息

越深的卷积层,提取的特征越复杂、越高级

②激活层(ReLU 等)

把没用的负数信息扔掉,引入非线性。让网络能学复杂非线性规律

池化层(Pooling Layer)

对特征图 “降采样”,压缩尺寸,保留最显著信息

减小尺寸,减少计算量

让特征对位置偏移、小变形不敏感(更鲁棒)

不学习参数,只是单纯压缩

不会丢失关键信息,只丢掉冗余细节

最常见:最大池化(Max Pooling)在 2×2 区域里只保留最大那个值(小的值一般是噪声,大的值是特征)

展平层(Flatten)

把二维 / 三维的特征图,拉成一维长向量。只是格式转换,不学习、不计算

⑤全连接层(Fully Connected Layer)

把前面提取的所有高级特征综合起来,做最终决策

每个神经元都和上一层所有神经元相连

负责全局特征融合

学习特征之间的复杂关系

最后一层输出类别概率(猫 / 狗 / 飞机…)

3.总结

神经网络是一个模型结构,自带迭代训练作用,

它有一套固定的训练流程

前向传播算结果

算损失(误差)

反向传播算梯度

优化器更新参数重复很多轮(迭代)

自带算法,而且算法很灵活,能自己学规律

传统算法:规律是人设计的神经网络:规律是数据喂出来的

二.实验代码和解析

import torch
from torch import nn
from d2l import torch as d2l

torch:神经网络的工具箱

nn:工具箱中搭建层的工具

d2l:下载数据,训练数据,画图的工具

net = nn.Sequential(
# 这⾥,我们使⽤⼀个11*11的更⼤窗⼝来捕捉对象。
# 同时,步幅为4,以减少输出的⾼度和宽度。
# 另外,输出通道的数⽬远⼤于LeNet
nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数
nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
# 使⽤三个连续的卷积层和较⼩的卷积窗⼝。
# 除了最后的卷积层,输出通道的数量进⼀步增加。
# 在前两个卷积层之后,汇聚层不⽤于减少输⼊的⾼度和宽度
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Flatten(),
# 这⾥,全连接层的输出数量是LeNet中的好⼏倍。使⽤dropout层来减轻过拟合
nn.Linear(6400, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096), nn.ReLU(),
nn.Dropout(p=0.5),
# 最后是输出层。由于这⾥使⽤Fashion-MNIST,所以⽤类别数为10,⽽⾮论⽂中的1000
nn.Linear(4096, 10))


卷积Conv2d:小窗口,负责看图找特征(边,角,纹理)

窗口kernel_size=放大镜的大小

步幅:stride=放大镜每次跳几格

通道:同时观察的特征种类

net = nn.Sequential();搭建一个名为net的网络

第一层:看大图,找粗略的特征

nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2),

nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1)1表示黑白照片,96表示通道,提取96种特征

nn.ReLU()让特征更清楚

nn.MaxPool2d(kernel_size=3, stride=2)将图片缩小一半

第二层:看得更细,特征更多

# 减⼩卷积窗⼝,使⽤填充为2来使得输⼊与输出的⾼和宽⼀致,且增⼤输出通道数 nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2),

第三层:连续看细节

# 使⽤三个连续的卷积层和较⼩的卷积窗⼝。 # 除了最后的卷积层,输出通道的数量进⼀步增加。 # 在前两个卷积层之后,汇聚层不⽤于减少输⼊的⾼度和宽度 nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2),

第四段:把图片展平,做判断题

nn.Flatten(), # 把图片拉成一条直线 # 这⾥,全连接层的输出数量是LeNet中的好⼏倍。使⽤dropout层来减轻过拟合 nn.Linear(6400, 4096), nn.ReLU(), nn.Dropout(p=0.5), # 随机忘掉一半,防止死记硬背 nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(p=0.5),

最后一层:输出答案(10 选 1)

Alexnet:把图片不断变小,提取的特征越来越多,越来越细,最后做出判断。

 

 

 

实验分析结果和分析见报告

 

 

更多推荐