学习链接:
https://www.bilibili.com/video/BV1Y7411d7Ys/?spm_id_from=333.999.0.0
一、线性模型
1.数据集分为 训练集和测试集
2.过拟合:训练的时候非常好,测试的时候差强人意
泛化能力好:对没有训练过的照片也能很好的识别
3.权重w先随机设定
loss指的是每一个数据的误差
目标是使整个训练集成本cost最小
4.线性模型
w使用穷举法,绘图w与cost关系图
5.np.meshgrid()绘制3D图
二、梯度下降算法
(一) 全体的梯度下降算法
1.首先要根据数据集,选取最合适的模型
2.穷举法不可取,维度爆炸
3.更新w的方法
4.cost函数是非凸函数,则很难找到全局最优
5.整体梯度下降算法
(二)随机梯度下降算法
1.若使用全体数据进行梯度下降算法,
2.随机梯度算法,求梯度是对 每一个样本对 的loss(x,y)求 梯度gradient(x,y)
3.随机梯度算法 时间复杂度太高了
(三) Mini-Batch 梯度下降算法
三.Back Propagation 反向传播算法
1.简单的线性模型
2.但对于复杂的网络,权重特别多,几乎无法计算
3.需了解 矩阵求导数 的公式
线性模型,不管多少层神经网络,其实没有影响
4.对于非线性模型,需要在输出后加上激活函数,比如sigmoid等,即是H1=sigmoid(WX+b),H1指的是第一层隐藏层
5.前向传播 后向传播
前向传播求y_hat,loss与后向传播求梯度
6.pytorch语言使用tensor来保存data以及grad
pytorch关于tensor的代码是在构建计算图
(1)数据集以及设置w初始值,将w设为需要计算梯度
(2)前向传播计算y_hat,x是标量,w是tensor,相乘后wx即y_hat自动转化为tensor,即y_hat也需要计算梯度;
(3)对每一对样本进行loss计算,后向传播求梯度l.backward()**指的是l对w求梯度,在此之后该计算图被释放,相当于清空计算图;
只要是关于tensor张量的量,就会生成计算图;
取得梯度.grad;
如果只需要更新数值,则需要加.data;
更新完数值后需要w.grad.data.zero(),将w梯度数据清零**
三.pytorch构建梯度下降模型具体思路及代码
**
步骤:前馈 损失值 反馈 清零 更新
**
1.初始化w,注意一定要创建张量tensor类型的w;
定义损失函数loss(即构建了计算图)
2.使用l.backward()反向计算w的梯度;注意w.grad也是梯度
**更新w,使用w.data以及w.grad.data来构建,**不可有任何张量在公式中
更新完毕,将梯度值清零,否则每次反向传播,都会将梯度与之前的梯度累加
四、(重点)pytorch建立线性模型
步骤:前馈 求损失值 梯度清0 反馈(求得模型中参数梯度) 更新(更新参数值)
1.随机梯度下降算法核心是求解loss对w的梯度,进而更新w
2.(1)构造数据集 (2)构建模型 (3)计算loss和建立优化器 (4)迭代周期
3.
(1)数据集
(2)构造模型
自己的模型定义为一个class,必须继承torch.nn.Module;
自己的模型必须实现两个函数:init()以及forward()
创建一个线性单元对象linear= torch.nn.Linear(输入的特征数量,输出的特征数量)
linear(x)是一个可调用的对象,__call__函数。
3.构造损失函数和优化器(训练器)
4.迭代周期
四、pytorch建立logistic回归模型
1.logistic函数,将实数映射到0-1
2.与线性回归区别
全部代码以及深度学习pytorch代码流程
五、处理多维特征的输入(分类)----重点
向量化运算有效提高cpu并行运行速度
神经网络层数太多,说明它学习能力非常强,但泛化不一定好,过拟合了,把噪音也学习了
1.糖尿病数据集,8维即8个特征即8列
2.模型代码改变
8列的x,1列的y
3.非线性降维 8维 降为6维 降为2维
如若建立下列模型,写代码
一、导入数据集
numpy转torch函数:torch.from_numpy()
[-1]与-1的去区别
二、建立模型
三、损失值、优化器
四、周期、前馈、清零、反馈、更新
六、pytorch中数据集 Dataset和Dataloader类
随机梯度下降算法是对每一个样本进行训练,优点是模型会更优,极大概率忽略鞍点的影响,缺点是没有利用gpu、cpu并行能力
minibatch即是综合梯度下降算法和随机梯度下降算法
1.epoch batchsize 和 iterations区别
假如样本数为10000,batch-size为1000,则iterations为10
epoch是所有的样本都要跑epoch次,放在最外面
2.Dataset 是一个抽象类,不可实例化【下标、长度】
__init__函数 里面需要有所有的x,y
__getitem__函数 需要return(x,y)
__len__函数需要return len
3.Dataloader 可以实例化
七、多分类问题——重点
1.手写字体识别,有10个类别,如何创建模型?
要求输出的时候是个分布,10个加起来得为1
把sigmoid换为softmax层后,输出的总和为1,并且输出结果都大于0
2.代码 多分类最后一层不需要加激活函数,激活函数包括在交叉熵函数里
利用softmax训练手写字
代码
x.view(-1,784)将图像转化为向量
八、卷积神经网络
1.全连接神经网络定义:多个线性层串联起来
2.对于图像分类来说,如果运用全连接层训练,则会丧失空间的特性
卷积+下采样 称为特征提取器
下采样是池化层
全连接层称为 分类器
下采样:减少数据量,降低后续运算
图像whc必须转为cwh
3.卷积操作
(1)单通道 看中心点位置
(2)多通道卷积
1)355图像 对应333卷积核 至 卷积结果133
2)卷积结果通道数不为1,则需要多个卷积核
(3)代码
卷积需要的参数 输入通道、输出通道、卷积核大小
padding可以使得卷积后图像大小与输入一样,即在最外层添加0
stride是步长,有效降低图像宽度高度
简单的神经网络
filter5*5,则原图像减(5//2)*2=4圈
2.代码
卷积 池化 全连接
加载至gpu
复杂卷积神经网络1
1.简单串行网络结构
2.稍微复杂一点的googlenet,这时候需要减少代码冗余,通过类
3.11卷积核
**11的卷积核可以改变(减小 )通道数,使得运算量大大减小**
4.
复杂卷积神经网络2——Residual Net
1.梯度消失——residualNet可以解决,有跳连接