一、深度学习介绍
二.安装(未完成)
下载了anaconda ,无法安装cuda
使用矩池云租用机器,硬件信息如下
提供了Jupyter记事本,非常方便
保证动起手跟着学。
也可以考虑fq使用谷歌的colab
三、数据操作+数据预处理
N维数组是深度学习的主要数据结构
创建数组:(所需三样)
1.形状2.每个元素的数据类型3.每个元素的值
访问元素:1.某行某列:[1,2]
2 .某行:[1,:]
- 某列:[:,1]
- 子区域:[1:3,1:](:后面是开区间)
- 子区域[::3,::2](::代表每x取一个)
数据操作: 导入torch:import torch
1.张量表示一个数值组成的数组:
2.shape属性访问形状和元素总数:
(标量)
3.改变形状而不改变数量值,用reshape函数
4.创建全0、全1
5.使用包含数值的python列表为新元素赋值
6.常见算数运算符(+,-,*,/和**)都可以按元素运算(*不是矩阵乘法,dot才是)
7. 把多个张量合并(dim=0,第0维合并)
上面用到的x.clone(),将y克隆成x,同时保证y与x无关(内存),修改y不会影响x
8.逻辑运算符:x==y
9.求和x.sum()
(得到的是一个标量,是所有元素和)
10.形状不同,可以通过广播机制按元素操作
(所谓广播机制,就是先将两个张量变为形状相同,都变为3*2矩阵,再按元素相加)
11.利用[-1]选择最后一个元素,如果是二维,选择最后一行
12.id用来查看内存
注意:y=y+x不是原地操作,为其分配了新的内存。
那么如何进行原地操作?
这样前后内存相等
还有,如果后续不会重复使用x,则可以使用x[:]=x+y或x+=y减小内存开销,前后x内存相等、
数据预处理(读取CSV文件,填充数据再表示为tensor)(所谓CSV是指,每一行是一个数据,用’,’分开)
(使用pandas库,其中包含可以读取CSV文件的函数pd.read_CSV()
- 先创建一个人工数据集,存储在CSV文件中
加载数据集:
2.处理缺失数据,包括插值与删除(对于int类型的缺失,将其填入其余值的平均值)
对于string类型的,将缺失的看为类,“NAN”看为一个类,用1和0表示是否是本类(变为纯0,1的矩阵)
现在所有的值都为数值类型,可以转换为张量格式
四、线性代数(一些基本的线代知识)
主要注意一点,按一个维度求和之后,会丢掉那个维度
例如:
按维度求和的示意图
(不知道为什么试验发现并未丢掉维度)
可以通过keepdims=True来确保不会丢掉维度
五、矩阵计算
导数
亚导数:将导数拓展到不可微的函数,例如y=|x|.
梯度:将导数拓展到向量
- 六、自动求导
链式法则
链式法则可以拓展到向量
计算图:
·将代码分解为操作子
·将计算表示为无环图
如例1.
(正向)
·显示构造
自动求导的模式:
·链式法则
·正向累积
·反向累积,又称反向传递
反向:从相反方向执行图,去除不需要的枝
自动求导的实现:
对y=2xTx求导,关于列向量x求导
通过调用反向传播函数来自动计算y关于x每个分量的
默认情况下,pytorch会累积梯度,需要清除之前的值
通过命令:x.grad.zero_()
深度学习中,目的是批量中每个样本单独计算的偏导数之和。
(向量函数求导很少,多数是标量求导)
清零后,计算出y=x*x的梯度
七、线性回归+基础优化算法
衡量预估质量
·比较真实值和预估值
·假设y是真实值,y’是预估值,
L(y,y’)=1/2(y-y’)2,叫做平方损失。
训练数据
·搜集一些数据来决定参数值(权重和偏差)
·这被称为训练数据
·通常越多越好
·假设有n个样本:
X=[x1,x2...xn],y=[y1,y2...yn]T
参数学习
·训练损失
L(x,y,w,b)=1/2n||y-xw-b||2
·最小化损失来学习参数
显示解
·将偏差加入权重
L(x,y,w)=1/2n||y-xw||2
·损失是凸函数
总结
·线性回归是对n维输入的加权,外加偏差
·使用平方损失来衡量预测值和真实值的差异
·线性回归有显示解
·线性回归可以看作是单层神经网络
基础优化方法
梯度下降
·挑选一个初始值w0
·重复迭代参数t=1,2,3
Wt=Wt-1-n(L/Wt-1)
·沿梯度下降方向将增加损失函数值
·学习率:步长的超参数(学习率的选择不能太长不能太小)
小批量随机梯度下降
·在整个训练集上算梯度太贵
·可以随机采样b个样本i1...ib来近似损失(b是批量大小,另一个重要的超参数)
总结:
·梯度下降通过不断沿着反梯度方向更新参数求解
·小批量随机梯度下降是深度学习默认的求解算法
·两个重要的超参数是批量大小和学习率
马上开始从零开始实现线性回归