25李沐动手学深度学习v2/填充和步幅

填充相同的高度和宽度,在所有侧边添加1个像素

import torch
from torch import nn

def comp_conv2d(conv2d,X):
    # 所有侧边添加1个像素
    X=X.reshape((1,1)+X.shape)
    Y=conv2d(X)
    # torch.Size([1, 1, 8, 8]) 1 通道数,1 batch_size
    Y.shape
    return Y.reshape(Y.shape[2:])

# 1输入通道数,1输出通道数,核大小3*3。padding是超参数,padding=1,上下左右都1像素
conv2d=nn.Conv2d(1,1,kernel_size=3,padding=1)
X=torch.rand(size=(8,8))
# 8+2-3+1=8,8+2-3+1=8
comp_conv2d(conv2d,X).shape
torch.Size([8, 8])

填充不同的高度和宽度

# padding 上下各2行 左右各1列
conv2d=nn.Conv2d(1,1,kernel_size=(5,3),padding=(2,1))
# 8+2+2-5+1=8,8+1+1-3+1=8
comp_conv2d(conv2d,X).shape
torch.Size([8, 8])

步幅的宽度和高度都是2

conv2d=nn.Conv2d(1,1,kernel_size=3,padding=1,stride=2)
# (8+1+1-3+2)/2=4,(8+1+1-3+2)/2=4
comp_conv2d(conv2d,X).shape
torch.Size([4, 4])
conv2d=nn.Conv2d(1,1,kernel_size=(3,5),padding=(0,1),stride=(3,4))
# (8+0+0-3+3)/3=2,(8+1+1-5+4)/4=2
comp_conv2d(conv2d,X).shape
torch.Size([2, 2])

总结

  • padding,防止输出shape太小
  • stride,防止输出shape太大
  • (输入行数+padding*2-kernel行数+stride)/stride
  • 通常,填充总量=核-1

query

超参数,核大小 填充 步幅 影响力大小

  • 答:通常,填充总量=核-1
  • 答:通常,步幅=1,最好,可以看到更多的东西
  • 答:不想要深的网络,通常,步幅=2

构造深度为100层的神经网络

  • 答:224x224的输入,把5个步幅为2的卷积层插到神经网络中即可

为什么卷积核的边长取奇数的多

  • 答:通常,填充总量=核-1。填充之后不改变对称性

核大小 填充 步幅超参数调节

  • 答:神经网络架构已经确定了这些超参数,一般不用调节

使用经典的网络结构

  • 答:对的,优先考虑ResNet系列,参照经典网络做改变

使用小的卷积核,视野小

  • 答:卷积核虽然小,但是每次看一局部信息,进而综合了局部信息,当神经网络很深时,往上抽象看到了全局信息

让超参数也一起参与学习

  • 答:NAS,现在是有钱人的游戏

多层卷积后信息丢失

  • 答:机器学习相当于极端压缩算法,一定会丢失信息的,抽象算法

多层3x3卷积类似于少层5x5卷积

  • 答:效果类似,但计算量随着卷积核变大而指数增加

简单的神经网络

  • 答:更容易流行。使用固定大小的核更简单

纹理特征

  • 答:不同的卷积核提取不同的纹理特征

你可能感兴趣的:(深度学习,深度学习,人工智能,神经网络)