《PyTorch深度学习实践》完结合集


理解 随机分布
- 什么是智能?
- 推理
- 信息 = 推理 = 》决策
- 预测
- 图像 和 抽象对象 联系起来
- 监督学习
- 基于统计

- 机器学习
- 表示学习
怎么设计学习系统?
- 基于规则的系统
- 求原函数:知识库、规则、搜索树
- 缺点:复杂系统,难设计维护
- 经典ML
- 手动特征提取(数据变向量)、找映射(mapping)
- 表示学习
- Features
- SVM family
- DL
- 变换、层、学习器
- 无监督:Feature的训练
- End to End 过程
- 为甚进行 特征提取
- 维度诅咒
- 大数定律
- 特征压缩
- 保持 高维空间的信息
- 表示学习 (Manifold 流形)
- 用来 降维
模型选择(经典ML)

- SVM 缺点
- 无结构 难
数学 工程学
- 寒武纪 眼睛 光线
- 运动

视觉是 分层结构
仿生学算法
- 反向传播 计算图 是为了求 链式法则的导数

【重点】学习 构造模型的方法,学会基本块,可以针对任务 组装自己的模型

学术 PyTorch
工业 TF
安装过程

按照 官网 下载
- 英伟达 安装 CUDA,自定义
- PyTorch
- 线性模型
过程:
- DataSet
- Model (选择/设计)
- Training (确定权重)
- inferring
> 人工 training

上图表示 ML 的过程
训练数据 可以表示 真实分布(整体)吗?
核心问题:
- 过拟合 =》 泛化能力
- 训练集 开发集
- 比赛时候 看不到 测试集
什么是模型?
思路:先用线性模型
预测结果 加帽子 y_hat
怎么计算?
- 随即猜测
- 评估 偏差
- 评估模型 =》 损失
> 有点像 实验设计
Error
MSE = Mean Square Error
这里用 穷举
# 重要 算法实现 线性回归

这个和 DL 关系
用训练 轮数(Epoc) 绘图

观察这个 ,用来判断 超参数
打印日志、或绘图
Visdom: 时间长,断点重开
模型持久化、存盘

3D 图的绘制
》》》》》》》》》》》》》》》》》》
03 梯度下降
- 真实情况
- 目标函数 多维 维度灾难
- 措施
- 分治
- 问题:局部最优
- 优化问题
梯度下降算法
梯度定义:

算法 = 贪心
可以得到 局部最优

DL 局部最优 少
存在 鞍点 g = 0【 没法继续 迭代】

把 公式 变成 函数(python 类)

目的: 函数图 收敛
怎么看 可以停?
- 指数平滑 可以更方便看 趋势

线 发散 的可能?
学习率 太大
随机梯度下降
引入 随机 跨过鞍点

权衡

Batch 折中
批量的随机梯度下降 SDD
Mini-Batch ,现在用Batch 代名
04 反向传播
简单模型 解析式
- 复杂模型
- w 权重很多
- 计算图
绿色 计算模块
矩阵乘法 matrix -cook -book

简单合并 会化简模型
为增加模型复杂性,做以下变换
增加 非线性变换函数 σ

求导
链式求导
第一: 制作计算图
第二:

完整的 计算图
蓝色 训练对象
残差项
损失

两个练习
- 。。。
- 。。。
Pytorch

构建模型 主要是构建 计算图
- 数据集
- 权重

代码 是 构建 计算图
l.backward 计算grad
w.data 不计算张量
w.grad.data.zero_() 清零

本质:
- loss
- backward
- 梯度下降 更新
小问题:
绘制 计算图

》》》》》》》》》》》》》》》
05 线性回归
PyTorch 的工具 完成 线性模型
有弹性、 可拓展
步骤:
- 数据集
- 设计模型
- 构造 loss 和 optimizer (封装的功能)
- 训练周期 (前馈、反馈、更新)

第一步
使用mini-batch
向量 矩阵 广播
mini-batch 数据需要是 矩阵
第二步
PyTorch 重点 构造计算图
这里是 线性单元

loss 标量
nn.Module 模板
继承
函数名 固定
自动 backward
Functions 类
构建自己的 求导块

使用 Linear 类 定义 Linear Unit

两种公式,目的 拼出 乘法的维度

检查:训练集、开发集 都 收敛

尝试 不同优化器

观察 损失降低的
》》》》》》》》》》》》》》》》》
06 Logistic Regression 做分类
MNIST Dataset 做分类
分类问题:
对象属于 类别的概率
- 数据集
- MNIST
- CIFAR10 类别彩图
类别 的 概率
x 映射 到 【0-1】
需要用 luojisite 函数
饱和函数
因为 正态分布 产生的函数

x 放 y_hat 求 概率

- 导函数 > 0
- 不断增加
- 饱和函数
所以 增加了 σ() 计算模块

距离最小化
分布 (这个在统计上 有什么意义?
分布差异
cross-entropy 交叉熵

加- 因为 最小

functional 包 有函数

BCE 二分类 交叉熵

框架 结构

这些模块 如果复杂,就单独写库/文件

得到的模型 进行可视化
07 多维特征的输入
输入的X 有多个特征

增加维度 增加了向量
Mini-Batch
向量函数 应用到每个元素上的函数
- 方程组 合成 矩阵运算
- 为了 并行计算

模型变换:维度 修改

多层网络
空间转换的函数 矩阵
- 线性 非线性
- 多个线性层 模拟 非线性
- Linear 降维
- σ() 非线性 【激活函数】

- 超参数 搜索
- 学习能力 要有 泛化能力

构造多层

医疗、保险 需要用
- 读取函数
游戏 显卡 32位浮点数

2 模型

序列式模型 forward 使用x , 为了避免错误
3 构造 损失和优化器

4 训练

ReLU 也常用 不连续

可以探索不同激活函数

就该 模型构建

ln 0 的问题 这里前向 改 sigmoid
0-1 光滑

》》》》》》》》》》》》》》》》》》
08 构造数据集 Dataset and DataLoader

概念:
- Epoch
- 循环 写嵌套循环
- 外层 周期
- 内层 batch
- Batch-Size
- Iterations

打乱
加载
操作: 索引、len

代码
Dataset 抽象类,只能被子类 继承
DataLoader 可以实例化,用来加载数据

数据 小 ,读到内存
数据 大, 不读
pytorch 0.4 报错 多进程的问题

loader 里数据 取出


这里改动是
- 数据导入 Dataset and Dataloader
- 循环处 使用Mini-Batch 需要的 嵌套循环
数据集


练习
Titanic 数据集
构造分类器,使用 DataLoader

》》》》》》》》》》》》》》》》》》
09 多分类问题
需要使用 softmax 分类器
想法1:每个作为 二分类
想法2:相互抑制

每个计算 相同 并行计算
- 分布 distribution
- 使用 概率分布
- 所以 增加 Softmax Layer
目的:
- >= 0
- 加和 = 1

等于1 的运算


下一个问题:损失函数



交叉熵损失

读文档,比较NLL CrossEL
代码

数据
图片处理 PIL pillow

pytorch 需要把 C 放前面 方便计算
Totensor
Normalize 标准化 (经验值) 切换到 0,1 分布

图像数据 在使用时 调用
全连接网络 一阶
-1? 自动计算 N 的数值
x.view(-1,784)

损失
带 冲量
训练
》 把训练 定义成 函数

测试 函数

问题:为啥有
total +=labels.size(0)
correct += (predicted == labels).sum().item()

可以 每10轮 测试一次
简洁
图像:
- 人工特征提取
- CNN 自动特征提取
练习

》》》》》》》》》》》》》》》》》》》》
10 卷积神经网络
二维卷积
步骤
- 卷积
- 下采样
- 卷积
- 下采样 (降维
- 展开
- 全连接
- 特征提取器 前部卷积
- 分类器

栅格 ccd
光敏电阻:一个光敏电阻 处理 一个光锥
获得 一个像素

电阻R 映射 光强G
有些相片是插值像素
- Patch 图像块 做卷积

卷积 包含 图像块的所有信息
运算过程
数乘 = 元素相乘

多通道 就得到 每个通道的卷积结果

卷积运算
卷积绘图

N个通道
- 如果要M 个输出?
- M个卷积核
- Cat 拼接

发现:
- 卷积核 通道数量 = 输入通道
- 卷积核 总数 = 输出通道
共享权重

4个维度 的卷积核
代码实现

重要的是 Conv2d 设置 : 4个参数
其他重要参数
padding 图像外填充 让 i/o 大小不变
填充0
卷积 = 线性计算
stride 步长 降低卷积结果的w/h
Max Pooling Layer 下采样
- 通道数量不变,找区域内最大



重点 维度相关:在输出 是否和 全连接层 维度对应
- 手算
- pytorch 输出看看维度 【常用】

view 改变 网络为 全连接网络

为什么 最后一层 不用激活?
怎么用 GPU
cuda : num (表示 显卡 索引)

to(device) 就可以把模型、数据给 显卡

错误率 降低了30%
练习

》》》》》》》》》》》》》》》》
11 CNN(高级版)
2种 复杂 CNN
LeNet 5
GoogLeNet
》 常作为 基础框架

减少代码冗余:函数/类

块 封装成 类
- Inception 盗梦空间

有多种 构造方式
提供几种 候选的 卷积核
Concatenate 张量拼接,多种路径下的张量的 拼接

Average Pooling 平均池化
- 1X1 Conv 作用
- 每个通道
- 可以跨越不同通道 相同位置的信息
- 信息融合
信息融合算法,加权求和


为什么有 192个通道?

增加 1X1 的卷积,节省 计算量
造卷积


放数组 ,用 cat ,维度为1

? Net里是什么?

【 位置 让pytorch 来求,减少错误
重点 使用了2 个 Inception 模块

根据test 来决定网络是否训练好
每个新高点 存盘
梯度消失
Residual net 可以解决 梯度消失问题
梯度 趋近于 0 难更新 =》 离输入近的 难更新
古早: 锁层
Residual net

加 x ,导数 + 1 ,梯度 不为 0
Plain net
Residual net, 有池化层


代码实现

把 计算图 翻译为 代码

网络复杂 用一些类来封装
分布式 渐增网络 【增量式开发】
练习

很多 Residual net 的设计
可以用 minist 做测试

Densely Net
后面的路
- 理论《深度学习》花书
- 工程、理论
- 阅读 PyTorch 文档(通读一遍)
- 复现 经典工作(代码下载 -> 跑 【会配置环境】 应该
- 读代码 开源代码(系统架构、训练架构、测试架构、数据读取架构、损失函数构建)
- 写代码
- 扩充 视野
- 知识 盲点(写代码的)
- 。。
- 需要长时间 积累