机器学习exp2-卷积神经网络
一.实验前的准备
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:把图片不断变小,提取的特征越来越多,越来越细,最后做出判断。
实验分析结果和分析见报告
更多推荐



所有评论(0)