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

发展曲线

- 用PyTorch实现学习系统
- 理解深度学习神经网络的基本概念

根据外部信息进行推理,做出决策或预测
决策


预测:把视觉信息或自然语言文本转化成抽象概念



和以往人工设定的方式不同,机器学习算法是从数据集里找出来


- 基于规则的学习系统
- 经典机器学习(手动提特征)
- 表示学习(通过学习提特征)
- 深度学习(属于表示学习)

经典机器学习路线

SVM受到的挑战

deep learning可以取得性能的提升
用仿生学的方法构建神经元模型,就叫感知机

对于神经网络最重要的,能让其工作起来的算法
核心:计算图




深度学习在以下几方面的改进





数据集没法表示真实分布
先用线性模型,看是否有效




穷举法代码实现


随着epoch的增加,训练集误差会趋于稳定,测试集会先减小后增大
每一次迭代都朝着下降最快的方向走一步,就是贪心算法(未必能得到最优,但能得到局部最优)

陷入鞍点会导致没法继续迭代

有噪声
加权平滑处理

训练发散(失败)原因:学习率太大


只用一个样本点,会得到比较好的随机性,跨越鞍点
性能好,能找到一个更优的点,但是时间复杂度太高,因为没法利用并行性
批量梯度下降 mini-batch梯度下降






例子


- 换一些值,走一遍过程
- 加偏置量
PyTorch里面最基本的数据类型:Tensor


看到代码,先画计算图





损失必须是标量


MSE损失函数


SGD优化器


总结

不同的优化器

mnist

cifar

回归vs分类

映射函数:sigmoid

常用的sigmoid函数:保证输出在0-1之间,最出名的是logistics函数


分类问题:计算分布之间的差异
交叉熵




均值求不求会影响学习率设置








矩阵就是从N维空间映射到M维空间的线性变换,可以把矩阵看成空间变换的函数

经常要做的空间变换不一定是线性的,将多个线性变换层通过找到最优权重,组合起来模拟出非线性变换
神经网络本质:寻找非线性空间变换函数

分步降低维度,在接起来之前一定要用sigmoid,每一次空间压缩都引入非线性,可以拟合我们真正想要的空间变换

generally speaking,中间隐藏层越多,中间跳的步骤越多,中间的神经元越多,将来对非线性的学习能力越强

however,学习能力太强,会把输入样本里噪声的规律也学到,我们希望模型有泛化能力



和上一讲没区别


不同的激活函数


使用mini-batch需要注意epoch,batch-size,iterations


dataset:抽象类,不能实例化,只能被其他子类继承

dataloader用来加载数据,可以实例化

自定义类,继承自dataset

init里面有两种选择(两种处理方式)
1、读取所有数据:适用于数据量不大(结构化数据),可以一次性加载到内存
2、初始化,定义一个列表,数据集里的每一
条数据的文件名放到相应列表里

四个参数

修改

二重循环:外层epoch,对一整批数据跑完一次;内层对train_loader作迭代

总代码


神经网络设计



损失函数

读文档

代码部分

转张量

归一化




训练和测试封装到函数里
训练

测试




构建神经网络
1、明白输入、输出的张量维度是什么
2、利用各种层进行维度上尺寸大小的变化,最终映射到想要的输出空间里面

图像块拿出来做卷积

输出的特征包含patch里的所有信息
多通道计算

















跨越不同通道相同位置元素的值

可以直接改变通道数量,减少计算量

用1x1卷积的神经网络也叫network in network



训练神经网络不是轮数越多越好,达到最优时继续训练可能会过拟合,
技巧:实际写代码,如果某一次测试集准确率达到峰值,可以把当前网络的参数备份,最后存盘的那个是泛化性能最好的

梯度消失:越来越小,趋近于0,权重得不到更新,离输入层比较近的这些块没法得到充分训练






增量式开发
找一篇论文

