暑假每日记
升大三暑假,每天记录学习深度学习和数学建模学到的东西。
前程似锦蝈蝈
这个作者很懒,什么都没留下…
展开
-
15 残差网络(ResNet)稠密连结网络(DenseNet)
残差神经网络残差块在实践中,添加层往往不会减低误差,使用批量归一化层可以提升数据的稳定性,但问题依然存在。如果我们的理想映射为f(x),那么虚线框里需要拟合出f(x)-x,残差映射比起直接拟合出f(x)更容易优化。当f(x)及接近恒等映射时,残差映射容易捕捉恒等映射的细微变动。class Residual(nn.Module): # 本类已保存在d2lzh_pytorch包中方便以后使用 def __init__(self, in_channels, out_channels, use_原创 2021-08-26 14:36:28 · 982 阅读 · 0 评论 -
14 批量归一化
批量归一化利用了小批量的平均值和方差,调整神经网络的中间输出。改善了因模型参数的更新造成的输出层输出的剧烈变化。对全连接层做批量归一化批量归一化层的输入是全连接层的输出,批量归一化层的输出是激活函数的输入。对一批小批量做归一化,目标维度是批次,即求出的均值的形状是一个样本的形状,对每一个样本做标准化后得到的也是一个样本的形状。引入可学习参数γ和β,与样本形状相同,分别与样本做按元素乘法和加法计算。最终得到了批量归一化层的输出yi在学习过程中,也存在批量归一化层不对样本造成任何变化的可能,即若原创 2021-08-26 14:34:33 · 191 阅读 · 0 评论 -
13 GooLeNet
含并行连结的网络,googlenetinception块inception出现了四条并行的线路。前三条线路的窗口大小分别为1,3,5,对第二条和第三条线路会进行1×1卷积减少通道数。最后在通道维上将每条线路的输出连结。因为inception块中引入了并行, 所以需要对其前向传播重定义,所以定义了一个类。class Inception(nn.Module): # c1 - c4为每条线路里的层的输出通道数 def __init__(self, in_c, c1, c2, c3, c4原创 2021-08-26 14:32:18 · 125 阅读 · 0 评论 -
12 VGG,NIN
vgg 利用重复块的网络与alexnet相比进步的地方在于出现了block结构,可以重复使用此结构来设计网络结构。vgg_block连续使用连续使用数个相同的填充为1、窗口形状为3×33\times 33×3的卷积层后接上一个步幅为2、窗口形状为2×22\times 22×2的最大池化层。池化层可以使输入高和宽减半。def vgg_block(num_convs, in_channels, out_channels): blk = [] for i in range(num_convs原创 2021-08-26 14:31:03 · 183 阅读 · 0 评论 -
11 卷积神经网络(LeNet)深度卷积神经网络(AlexNet)
卷积神经网络(LeNet)import timeimport torchfrom torch import nn, optimimport syssys.path.append("..") import d2lzh_pytorch as d2ldevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')class LeNet(nn.Module): def __init__(self):原创 2021-08-26 14:29:08 · 427 阅读 · 0 评论 -
10 池化层
池化层的作用是缓解卷积层对位置的过度敏感,解决图像中的物体出现的像素点偏移的问题池化层分为最大池化层和平均池化层也可以设置填充和步幅pool2d = nn.MaxPool2d((2, 4), padding=(1, 2), stride=(2, 3))在多通道情况下,池化层不会改变通道数量,是对所有输入层分别池化然后输出。...原创 2021-08-18 18:04:47 · 865 阅读 · 0 评论 -
9 卷积、padding,stride、多通道输入输出
卷积和互相关https://zhuanlan.zhihu.com/p/33194385深度学习中的卷积运算实际上就是互相关运算感受野卷积的目的:我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。填充和步幅填充是指在输入的高和宽方向两侧填充元素,通常是0,使高和宽增大。使输出高宽增加。步幅是卷积核在高宽方向上以stride为每次移动的距离。使输出高宽减小。填充和步幅默认高宽相同,可以给定列表分别设置例如 stride = (2,3)一般情况下原创 2021-08-18 18:04:25 · 373 阅读 · 0 评论 -
8 读取和存储Tensor
torch.save(tensor,'xxx.pt')l = torch.load('xxx.pt')# 储存一个tensor列表torch.save([x,y],'xy.pt')#储存一个tensor字典torch.save({'x':x,'y':y},'xy_dict.pt')保存和加载模型torch.save(model.state_dict(),PATH)# 后缀为.ptmodel = TheModelClass(*args,**kwargs)model.load_state_d原创 2021-08-18 18:03:27 · 276 阅读 · 0 评论 -
7 自定义层
如何定义一个自定义层import torch from torch import nnclass MyLayer(nn.Module): def __init__(self,**kwargs): super(Mylayer,self).__init__(**kwargs) def forward(self,x):自己定义init和forward规则自定义参数时 可以使用ParameterList和ParameterDict分别定义参数的列表和字典原创 2021-08-18 18:02:50 · 67 阅读 · 0 评论 -
6 模型参数操作
模型参数访问Module类的parameter(),named_parameter()返回generator,后者返回名字和tensornet.parametor()返回所有层的参数,net[0].parametor返回第一层的参数在init()函数里,如果tensor是torch.nn.parameter.Parameter类型,则会被自动添加到模型的列表里因为Parameter是Tensor,即Tensor拥有的属性它都有,比如可以根据data来访问参数数值,用grad来访问参数原创 2021-08-18 18:02:26 · 99 阅读 · 0 评论 -
5 模型构造
Module类import torchfrom torch import nnclass MLP(nn.Module): # 声明带有模型参数的层,这里声明了两个全连接层 def __init__(self, **kwargs): # 调用MLP父类Module的构造函数来进行必要的初始化。这样在构造实例时还可以指定其他函数 # 参数,如“模型参数的访问、初始化和共享”一节将介绍的模型参数params super(MLP, self).原创 2021-08-18 18:01:48 · 104 阅读 · 0 评论 -
4 模型初始化
当模型层数过多时,最后的输出容易过大或过小,引起衰减和爆炸。模型初始化初始化的原因如果某一隐藏层的参数相同,则反向传播后的梯度相同,经过基于梯度的优化算法的迭代后的值也相同。则本质上这一层只有一个神经元发挥作用,所以初始化使参数不同。pytorch初始化模型参数通常采用nn.init.normal_(param, mean=0, std=0.01)进行正态分布式初始化也有通过Xavier随机初始化,假设全连接层输入个数为a,输出个数为b。则将每个参数均匀分布于使得每层输出的方差不受输入原创 2021-08-18 18:01:20 · 706 阅读 · 0 评论 -
3 应对过拟合的两种方法-----正则化和丢弃法
权重衰减权重衰减等价于L2正则化。正则化是通过在模型损失函数上添加正则项,约束所学到的参数,使其接近于0。如上图所示,由红到绿,增加了泛化能力。L2正则化在损失函数后新增一个正则化项其中w1,w2是权重参数,b是偏差参数,样本数为n。将权重参数用向量w=[w1,w2]表示经过小批量梯度下降后,参数变化情况权重衰减可以通过优化器中的weight_decay超参数来指定丢弃法规定概率p,对隐藏层中的所有单元,以概率p清零选定的隐藏单元,反向传播时,被清零的隐藏单元梯度为0,并对其他单元除以原创 2021-08-18 18:00:18 · 175 阅读 · 0 评论 -
2 多层感知机原理、模型选择、过拟合
多层感知机是在单层神经网络的基础上,添加了一个到多个隐藏层对于单隐藏层神经网络,H为隐藏层的输出,O为输出层的输出[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6LrBGVN-1629280510820)(https://i.loli.net/2021/08/05/5j4JO6ad9NSeYyK.png)]将这两个式子联立起来无论是隐藏层有多少,其与单层神经网络等价。激活函数激活函数包括sigmoid,Relu,tanh。目的是使隐藏层引入非线性变换,使隐藏层原创 2021-08-18 17:55:33 · 524 阅读 · 0 评论 -
1 softmax回归原理
矢量加法可以提升速度,经可能多使用矢量加法而非循环a = torch.zero(1000)b= torch.zero(1000)start = time()d = a + bprint(time() - start)pytorch 基于numpy的广播机制a = torch.ones(3)b = 10print(a + b)# tensor([11., 11., 11.]如果我们想要修改tensor的数值,但是又不希望被autograd记录(即不会影响反向传播),那么.原创 2021-08-04 23:37:12 · 711 阅读 · 1 评论