pytorch基础学习(4)
admin
2024-03-15 04:56:43
0
  1. 在不同的文献中卷积核的叫法可能不同,Kernel、Filter、Weight指的都是卷积核。
  2. 2D卷积
    1. Kernel Channels
      1. Kernel Channels是两个值组成的一组值,表征了这个卷积核将输入图像从多少个通道映射到多少个通道上(也可以反过来写):(和Input Channels相等的通道数,用了多少种卷积核):
        1. 种:实际用的卷积核数量是Input Channels乘以后面的这个"卷积核种数“,即”对于每种卷积核都按照输入通道数分成了不同通道上的卷积核,对于不同通道上的同种卷积核:它们不共享权值,但共享一个偏置。
        2. 理解实际卷积核的数量是输入通道数乘以卷积核种类数,可以运行:
          import torch
          from torch import nn
          layer = nn.Conv2d(2, 3, kernel_size=3, stride=1, padding=0)
          layer.weight
          可以看到输出的有三组(因为有三种卷积核),每组有两个3乘3的卷积核(因为输入有两个通道)。
    2. Kernel Size指卷积核的长宽,如为3则卷积核是3乘3的。
    3. 例子:
      """2维的卷积层,用于图片的卷积"""
      # 输入图像的通道数=1(灰度图像),卷积核的种类数=3
      # 卷积核的shape是3乘3的,扫描步长为1,不加padding
      layer = nn.Conv2d(1, 3, kernel_size=3, stride=1, padding=0)"""使用上面定义的卷积层layer和输入x,完成一次卷积的前向运算"""
      out = layer.forward(x)
      特别注意,在使用时应该直接使用layer(x)而不是layer.forward(x),因为前者实际是调用了__call__(),而PyTorch在这个函数中定义了一些hooks,如果要使用这些钩子的功能就只能用前者了!它会先运行hooks再运行.forward()函数。
    4. 查看卷积层信息:
      1. 在前面定义的卷积层的基础上,查看一下卷积层的权重(即卷积核)信息和偏置信息:
        print(layer.weight)
        print(layer.bias)
      2. 查看一下shape:
        print(layer.weight.shape)
        print(layer.bias.shape)

    5. F.conv2d(函数式接口):
      1. PyTorch里一般小写的都是函数式的接口,相应的大写的是类式接口。函数式的更加low-level一些,如果不需要做特别复杂的配置只要用类式接口就够了。
      2. 可以这样理解:nn.Conv2d是[2D卷积层],而F.conv2d是[2D卷积操作]。
        """手动定义卷积核(weight)和偏置"""
        w = torch.rand(16, 3, 5, 5)  # 16种3通道的5乘5卷积核
        b = torch.rand(16)  # 和卷积核种类数保持一致(不同通道共用一个bias)
        """2D卷积得到输出"""
        out = F.conv2d(x, w, b, stride=1, padding=1)  # 步长为1,外加1圈padding
    6. 在CNN中,基本的单元是一个Conv2d,后面配上[Batch Norm, pooling, ReLU],后面三个的顺序不一定。
  3. pooling池化
    1. 下采样(down-sample)的一种手段,让feature map减小;而up-sample则是上采样,实际上做了放大图像的操作。
    2. 池化核的移动位置一般是没有重叠的,然后在池化核扫过的地方进行一个函数运算,将其映射到一个新值上,也就完成了down-sample。
    3. 函数和类接口:
      # 池化层(池化核为2*2,步长为2),最大池化
      layer = nn.MaxPool2d(2, stride=2)
      使用函数式接口:# 池化运算(池化核为2*2,步长为2),平均池化
      out = F.avg_pool2d(x, 2, stride=2)
    4. up-sample:最近插值 :只要简单复制最近的元素指定的次数就可以了
       # 向上采样,放大2倍,最近插值
      out = F.upsample(x, scale_factor=2, mode='nearest') # 旧的接口
      print(out.shape)out = F.interpolate(x, scale_factor=2, mode='nearest') # 新的接口
  4. ReLU
    1. 把负的地方映射到0,相当于把feature map中的响应低的部分去掉,并保持正的响应不变。
    2. 类式接口:
      # ReLU激活,inplace=True表示直接覆盖掉ReLU目标的内存空间
      layer = nn.ReLU(inplace=True)
      out = layer(x)
    3. 函数式接口:
      # ReLU激活
      out = F.relu(x)
  5. normalization:
    1. 标准的Batch Normalization一个Batch的图像数据shape为[样本数N, 通道数C, 高度H, 宽度W],将其最后两个维度flatten,得到的是[N, C, H*W],标准的Batch Normalization就是在通道Channel这个维度上进行移动,对所有样本的所有值求均值和方差,所以有几个通道,得到的就是几个均值和方差。
    2. Layer Normalization:Layer Normalization是在实例即样本N的维度上滑动,对每个样本的所有通道的所有值求均值和方差,所以一个Batch有几个样本实例,得到的就是几个均值和方差。
    3. Instance Normalization:在样本N和通道C两个维度上滑动,对Batch中的N个样本里的每个样本n,和C个通道里的每个样本c,其组合[n, c]求对应的所有值的均值和方差,所以得到的是N⋅C个均值和方差
  6. Batch Normalization
    1. 为解决sigmoid梯度消失或爆炸提出,当将输出送入Sigmoid这样的激活函数之前,进行一个Normalize的操作,例如将其变换到N(0,σ^2),即在0的附近,主要在一个小范围内变动。
    2. 直观解释:输入的x范围相差较大时会导致相应权值w1和w2的变化引起的变化幅度不同,还会使得搜索空间看起来有点"扭曲",如果正则化后:从哪个位置开始搜索应该都能更好的找到全局最优,是一个**特征缩放(feature scaling)**的操作。
    3. 输入数据是6张3通道784个像素点的数据,将其分到三个通道上,在每个通道上也就是[6, 784]的数据,然后分别得到和通道数一样多的统计数据均值μ和方差σ ,将每个像素值减去μ除以σ也就变换到了接近N(0,1)的分布,后面又使用参数β 和γ 将其变换到接近N(β,γ)的分布。
    4. 注意:μ和σ只是样本中的统计数据,是没有梯度信息的,不过会保存在运行时参数里。而γ 和β 属于要训练的参数,他们是有梯度信息的。
    5. 例子:
      # Batch Normalization层,因为输入是将高度H和宽度W合成了一个维度,所以这里用1d
      layer = nn.BatchNorm1d(16)  # 传入通道数
      out = layer(x)# 全局的均值mu
      print(layer.running_mean)
      # 全局的方差sigma^2
      print(layer.running_var)
      1. 注意layer.running_mean和layer.running_var得到的是全局的均值和方差,不是当前Batch上的,只不过这里只跑了一个Batch而已所以它就是这个Batch上的。现在还没有办法直接查看某个Batch上的这两个统计量的值。
      2. 如果在定义层时使用了参数affine=False,那么就是固定γ = 1和β = 0 不自动学习,这时参数layer.weight和layer.bias将是None。
    6. 类似于Dropout,Batch Normalization在训练和测试时的行为不同。
      1. 在定义layer后,看到参数train=True表示现在在训练模式(默认),train=False表示在测试模式。
      2. 要切换为Test模式,需要在定义layer后使用layer.eval()将其转换!而不是直接写参数train=False。因为总要在训练了之后再做测试吧!如果这种参数放到层的定义时去指定,那就没法切换了(因为定义只有一次)。
    7. 使用了Batch Normalization让Converge(收敛)的速度加快了,可以直观理解,使用了靠近0的部分的Sigmoid激活,其梯度信息更大了。并且能够得到一个更好的解。

    8. 提升了Robust(鲁棒性),这使得网络更加稳定,理解:如果参数有大有小,解空间像左边一样,那么稍微调整学习率可能就发生抖动,或者训练速度太慢,这让超参数的调整没有那么敏感。

  7. 查看网络中一个层上的所有参数,用vars(layer)查看。

相关内容

热门资讯

国联银行间1-3年中高等级信用... 2月28日,国联银行间1-3年中高等级信用债指数(003081)发布公告,基金经理王玥因工作安排于2...
GDP增长5.0%!2025年... 据央视新闻消息,2月28日,国家统计局发布《中华人民共和国2025年国民经济和社会发展统计公报》。
最快3月秘密交表!SpaceX... 据“财联社”2月28日消息,最新市场传闻显示,世界首富马斯克旗下民营航天公司SpaceX正推进IPO...
startrader:中东局势... 2 月 27 日夜间,受中东地缘局势急剧升温影响,全球避险情绪集中爆发,国际黄金、白银、原油三大品种...
折扣叠加财政贴息 银行信用卡账... 本报记者 彭妍 今年1月份,财政部等三部门优化实施个人消费贷款财政贴息政策。在政策支持下,多家银行加...
东莞A股上市公司市值站上800... 界面新闻记者 | 梁宝欣 界面新闻编辑 | 林腾 2月26日,东莞召开新春第一会,主题为“资本赋...
国内实力AI超级员工公司哪家强... 国内实力AI超级员工公司哪家强?这篇给你靠谱答案! 在数字化发展的当下,AI超级员工领域迅速崛起,众...
最强业绩下市值蒸发万亿,全球最... 「核心提示」 当“超预期”成为常态,英伟达的下一个叙事在哪里? 作者 | 张经纬 编辑 | ...
华尔街血色周五!MFS危机涉及... 财联社2月28日讯(编辑 潇湘)周五,华尔街贷款机构因英国一家名不见经传的抵押贷款供应商——MFS的...
干细胞研发机构—打干细胞真的有... 关于“干细胞研发机构—打干细胞真的有用吗”详情 可以添加微信或拨打电话 【微信:nanyu4390】...
消息称马斯克的 SpaceX ... 感谢IT之家网友 的线索投递! 2 月 28 日消息,据彭博社今日报道,知情人士透露,埃隆 · 马...
英伟达公布业绩后股价再度大跌 ... 【CNMO科技消息】当地时间2月27日,全球市值最高的上市公司英伟达在公布业绩后连续第二天走弱,同时...
雷军马年首播 2月27日晚,小米集团董事长雷军开启春节假期后的首场直播,也是马年的首场直播,2026年的第6场直播...
银行“盯上”儿童压岁钱 “一张存单,承载孩子成长的每一个美好瞬间。少儿专属存款3年期年利率1.91%,额度有限先到先得。”刚...
深交所晒出“十四五”成绩单 服... ◎记者 时娜 累计服务实体经济直接融资规模超12万亿元,新增上市公司649家,IPO募集资金6023...
消息称SpaceX将秘密提交I... IT之家 2 月 28 日消息,据彭博社今日报道,知情人士透露,埃隆 · 马斯克的 SpaceX 公...
年味里的消费迁移:2026春节... 2026 年作为 “十五五” 开局之年,其春节消费市场展现出消费从功能满足向 “意义与价值” 驱动转...
手机集体涨价后,汽车会是下一个... 继存储芯片成本的飙升导致手机集体涨价,汽车是否也会因此涨价成为大众关注的新焦点。汽车存储芯片主要分为...
新规后首批!4只互认基金获批,... 财联社2月28日讯(记者 闫军)财联社记者从业内独家获悉,2月27日,互认基金新规后首批4只互认基金...
“十五五”开局看河北|民企信用... (来源:河北新闻网) 转自:河北新闻网 河北数字工商联平台帮助34.8万户企业获得银行授信2523....