Pytorch基础点

过拟合就是数据少,训练多,尽量做到泛化    过拟合了,再开发集(验证集)和测试集上效果就变差

学习能力越强,有可能会把输入样本中噪声的规律也学到。我们要学习数据本身真实数据的规律,学习能力要有泛化能力

神经网络的参数w和b是网络需要学习的,其他是已知的。

损失函数的作用

  • 用随机值初始化前向计算公式的参数;
  • 代入样本,计算输出的预测值;
  • 用损失函数计算预测值和标签值(真实值)的误差;(最主要的)
  • 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
  • goto 2, 直到损失函数值达到一个满意的值就停止迭代。

每次要把梯度设为0是因为不设为0pytorch中会将上次计算的梯度和本次计算的梯度累加

维度即特征

.学习率是一个重要的超参数,它控制着我们基于损失梯度调整神经网络权值的速度(可以理解为权重变化的步长). 学习率越小,我们沿着损失梯度下降的速度越慢,收敛也就越慢;学习率越大,梯度会在最小值附近来回振荡。可以避免错过任何局部最优解,但它也意味着我们要花更多时间来收敛,尤其是如果我们处于曲线的至高点

计算权重时(反向传播):w = w - αg    g即为梯度,当g变化趋近于0时,w不变化,即为梯度消失(α为学习率)

梯度下降法利用的贪心原理,一般来说求得局部最优(局部收敛)

为什么要加入激活函数(非线性函数),这样的话,W = W1*W2就无法合并计算了,还是按照每层隐藏层来计算,当前层的输出结果作为下一层的输入

不加入激活函数,多少层和一层就没区别了,因为权重矩阵可以合并;得让每次拟合都有意义

更能体现深度的含义,深度增加训练的权值越多,最后模型的效果越好

引入激活函数后,使得神经网络可以逼近任何非线性函数,理论上可以拟合任意分布的数据

 

反向传播,z是输出,通过损失函数计算 L对z的偏导,又因为Z = f(x,w),即可以求得Z对w的偏导,再通过链式求导法则求出L对w的偏导

最终通过求出偏导可以对梯度进行更新

权值更新算法(优化算法)是深度学习模型训练中相当重要的一个模块,能决定参数更新的方向与速度,好的权值更新算法和适当的优化参数能使模型更快、更准确地收敛。

Batch_size的选择决定了梯度下降的方向,选择过小,随机性会加大,多数情况难以收敛,较大的Batch_size可以减少训练时间,提高内存利用率,梯度下降方向较为准确,不容易引起振荡,但也不能盲目加大,盲目加大Batch_size,模型的泛化能力会降低

pytorch中,tensor(可以是一维向量,二维矩阵,多维等等)一般保存数值本身(data)和损失函数对权重的倒数(偏导)(grad)                   所以一般取值都是tensor.data     同时grad本身也是一个tensor,  所以取值的时候是tensor.grad.data,如果单纯的取tensor,grad会生成一个计算图

CrossEntropy:交叉熵

BCELoss - Binary CrossEntropyLoss 

     BCELoss 是CrossEntropyLoss的一个特例,只用于二分类问题,而CrossEntropyLoss可以用于二分类,也可以用于多分类。     如果是二分类问题,建议BCELoss

处理多维特征的输入,w1-w8都是一样的,b也是一样的,就是x1-x8(样本的特征不同)

dataloader,shuffle就是从dataset中打乱顺序后,再loader重新组合,生成可迭代对象,可用for遍历

Dataset是一个抽象类,无法实例化,只能通过子类继承,再实例化子类

DataLoader是可以实例化的

num_worker=表示用几个进程来并行的读取数据,一般去4-8,不是越高越好

多分类问题用softmax,确保每个概率>0(做了指数运算)且保证每个概率之和为1(做了归一化处理)经过归一化,图像像素被调整到[0,1]区间内。

Torch.nn.CrossEntropyLoss()包含Softmax和Loss(因此最后一层不需要做非线性变化(即激活)),直接交给交叉熵损失

transforms.ToTensor()的作用就是把图像处理成张量

transforms.Normalize(均值,标准差)标准化处理(这里处理的Minist只有一个通道,所以均值和标准差都只有一个)经过标准化,图像像素被调整到[-1,1]区间内。

数据标准化是一种特殊的归一化技术

神经网络喜欢0-1分布的数据

momentum表示冲量,简单来说就是给数据处理一个惯性值,可以从局部极值走出来尽可能找到全局最优解

这里就是进行卷积操作,可以求和也可以算均值

卷积:先特征提取,最后进行分类(全连接层进行分类)(可能会有几个或者一个全连接层)

卷积核通道数等于输入的通道数      卷积核的数量等于输出的通道数   进行卷积操作与神经网络中权值计算性质类似。卷积会保留图片数据的空间特征

卷积核的大小对2整除,结果即为原始数据减结果的圈数

卷积核,view后面的参数分别为:输出的通道数,输入的通道数,宽和高 

padding = 0,卷积操作是否补0。

池化(作用:减低矩阵的维度)时通道时不会变化的,变化的只有宽和高(同一个通道进行变化)

参数分别为输入的通道数和输出的通道数还有卷积核的大小 

全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用

x = x.view(batch,-1)    这里batch是数据的个数      pring(x.shape)即可获得这里的batch

(多用于全连接层确定参数)

inceptionModule(也称GoogLeNet)    最后串成一串(拼接)

这里1*1的卷积核 的数量核通道数相同

使用1x1卷积核虽然参数量增加了,但是能够显著的降低计算量(operations) 

 上方是init定义的     下面是forward定义的  (这里最下面少写了一个branch3*3 = self.branch3*3_3(branch3*3)

  最后拼接到一起      拼接操作cat    dim=1   (b,c,w,h)沿着c的维度开始拼接 

对Inception Module 进行封装,outputs是列表集合,通过torch.cat进行concatenate

outputs = [branch1x1, branch5x5, branch3x3, branch_pool]

return torch.cat(outputs, dim=1) # b,c,w,h c对应的是dim=1

 PyTorch 深度学习实践 第11讲_bit452的专栏-CSDN博客  

RESNET    

跳连接,H(x) = F(x) + x,张量维度必须一样,加完后再激活。不要做pooling,张量的维度会发生变化。

增进式开发,慢慢确定参数

 Identity Mappings in Deep Residual Networks(译)

再网络中,卷积层运算是比较复杂的,但权重并不多(计算量),全连接层则相反

RNN主要处理具有序列(先后时间序列等)连接的数据(例如:天气,股市,经济,自然语言等)

一次次输入序列,经过一次次RNN,得到隐层的过程,就是一个个循环神经网络

这个融合看下面的

Xt  是一个输入,input_size*1 大小,所以Wih 大小为hidden * input  加上一个偏重就是hidden * 1

同样左上方也是这样,最后两个加起来,信息综合,经过激活tanh  得到Ht

Ht-1 是h*1  同样,得到的输出也是h*1

自己定义RNNCell

 RNN计算耗时大,不建议层数过深

 (三层,每个RNN的输入不仅要传入右侧的RNN,还要传入上层的RNN)

左侧是每一层RNN的前置条件,下侧为输入序列。右侧为每一层的隐藏层最终输出,上侧为隐藏层输出序列。

Example

输入序列的每一个字符(单词)构造字典(词典),此时每一个字符都会有一个唯一的数字与其一一对应。即将字符向量转换为数字向量。之后利用独热编码(One-Hot)的思想,即可将每个数字转换为一个向量。

对于序列中的每一个输入,都有一个数字输出与其对应,即本质上是在求当前输入所映射到输出字典中最大概率的值。即变为多分类问题。而此时的输出维度为3。

 其中RNNCell的输出维度为4,经过Softmax求得映射之后的概率分别是多少,再利用输出对应的独热向量,计算NLLLoss。

 独热编码的缺点:高维度,稀疏,硬编码(自己编码的,不是通过学习来的)

映射到嵌入式编码       ,降维 ,也可以升维

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值