上一篇讲了防止过拟合的一种方式,权重衰减,也即在loss上加上一部分\(\frac{\lambda}{2n} \|\boldsymbol{w}\|^2\),从而使得w不至于过大,即不过分偏向某个特征. 这一篇介绍另一种防止过拟合的方法,dropout,即丢弃某些神经元的输出.由于每次训练的过程里,丢弃掉哪些神经元的输出都是随机的,从而可以使得模型不过分依赖于某些神经元的输出,从而达到防止过拟合的目的. 需要注意的一点是:并不是简单地丢弃掉某些神经元的输出,对留下的输出,我们要改变他们的值,以保证…
跟着Dive-into-DL-PyTorch.pdf从头开始学pytorch,夯实基础. Tensor创建 创建未初始化的tensor import torch x = torch.empty(5,3) print(x) 输出 tensor([[ 2.0909e+21, 3.0638e-41, -2.4612e-30], [ 4.5650e-41, 3.0638e-41, 1.7753e+28], [ 4.4339e+27, 1.3848e-14, 6.8801e+16], [ 1.8370e+…
AlexNet AlexNet是2012年提出的一个模型,并且赢得了ImageNet图像识别挑战赛的冠军.首次证明了由计算机自动学习到的特征可以超越手工设计的特征,对计算机视觉的研究有着极其重要的意义. AlexNet的设计思路和LeNet是非常类似的.不同点主要有以下几点: 激活函数由sigmoid改为Relu AlexNet使用了dropout,LeNet没有使用 AlexNet引入了大量的图像增广,如翻转.裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合 激活函数 relu \[\text…
深度学习中常常会存在过拟合现象,比如当训练数据过少时,训练得到的模型很可能在训练集上表现非常好,但是在测试集上表现不好. 应对过拟合,可以通过数据增强,增大训练集数量.我们这里先不介绍数据增强,先从模型训练的角度介绍常用的应对过拟合的方法. 权重衰减 权重衰减等价于 \(L_2\) 范数正则化(regularization).正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段.我们先描述\(L_2\)范数正则化,再解释它为何又称权重衰减. \(L_2\)范数正则化在…
关于什么是线性回归,不多做介绍了.可以参考我以前的博客https://www.cnblogs.com/sdu20112013/p/10186516.html 实现线性回归 分为以下几个部分: 生成数据集 读取数据 初始化模型参数 定义模型 定义损失函数 定义优化算法 训练模型 生成数据集 我们构造一个简单的人工训练数据集,它可以使我们能够直观比较学到的参数和真实的模型参数的区别.设训练数据集样本数为1000,输入个数(特征数)为2.给定随机生成的批量样本特征 \(\boldsymbol{X} \…
VGG AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路. VGG做到了这一点,提出了可以通过重复使⽤简单的基础块来构建深度学习模型的思路. 论文地址:https://arxiv.org/abs/1409.1556 vgg的结构如下所示: 上图给出了不同层数的vgg的结构.也就是常说的vgg16,vgg19等等. VGG BLOCK vgg的设计思路是,通过不断堆叠3x3的卷积核,不断加深模型深度.…
残差网络ResNet resnet是何凯明大神在2015年提出的.并且获得了当年的ImageNet比赛的冠军. 残差网络具有里程碑的意义,为以后的网络设计提出了一个新的思路. googlenet的思路是加宽每一个layer,resnet的思路是加深layer. 论文地址:https://arxiv.org/abs/1512.03385 论文里指出,随着网络深度的增加,模型表现并没有更好,即所谓的网络退化.注意,不是过拟合,而是更深层的网络即便是train error也比浅层网络更高. 这说明,深…
PyTorch提供的autograd包能够根据输⼊和前向传播过程⾃动构建计算图,并执⾏反向传播. Tensor Tensor的几个重要属性或方法 .requires_grad 设为true的话,tensor将开始追踪在其上的所有操作 .backward()完成梯度计算 .grad属性 计算的梯度累积到.grad属性 .detach()解除对一个tensor上操作的追踪,或者用with torch.no_grad()将不想被追踪的操作代码块包裹起来. .grad_fn属性 该属性即创建Tensor…
模型构造 nn.Module nn.Module是pytorch中提供的一个类,是所有神经网络模块的基类.我们自定义的模块要继承这个基类. import torch from torch import nn class MLP(nn.Module): # 声明带有模型参数的层,这里声明了两个全连接层 def __init__(self, **kwargs): # 调用MLP父类Module的构造函数来进行必要的初始化.这样在构造实例时还可以指定其他函数 # 参数,如"模型参数的访问.初始化和共享…
模型读取和存储 总结下来,就是几个函数 torch.load()/torch.save() 通过python的pickle完成序列化与反序列化.完成内存<-->磁盘转换. Module.state_dict()/Module.load_state_dict() state_dict()获取模型参数.load_state_dict()加载模型参数 读写Tensor 我们可以直接使用save函数和load函数分别存储和读取Tensor.save使用Python的pickle实用程序将对象进行序列化…