本篇主要记录一下卷积神经网络的相关知识

一、多通道

  对于原来1通道的28*28的一个Image通过7个不同的卷积核,可以理解为从7个不同的角度观察这个图片,得到7个通道的新的feature map
图片描述
图片描述
  下面以该图为例,解释各参数的size

  • x:[batch_size, ch_in, 28, 28]
      [b, 3, 28, 28],3是表示 RGB 3通道
  • 单个卷积核:[ch, 3, 3]
      [3, 3, 3],3同样表示 RGB 3通道,这里必须和输入的通道数匹配,后面的是卷积核的size
  • 多个卷积核:[16, ch, 3, 3]
      16表示卷积核的个数,这里是单纯地复制,是完全一样的16个(批)
  • bias:16
  • output:[batch_size, ch_in, 28, 28]
      [b, 16, 28, 28]

二、API使用

  小写的nn.F中的conv2d和Conv2d用法含义类似(参数有所不同[input,kerbel,output,stride等…])),这里不再赘述

layer = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, stride=1, padding=0)
x = torch.rand(1, 1, 28, 28)

out = layer.forward(x)
# Out[4]: torch.Size([1, 3, 26, 26])

layer = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, stride=1, padding=1)
out = layer.forward(x)
# Out[6]: torch.Size([1, 3, 28, 28])

layer = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, stride=2, padding=1)
out = layer.forward(x)
# Out[8]: torch.Size([1, 3, 14, 14])

# 推荐写法,比调用.forward()会多hooks等操作
out = layer(x)
# Out[10]: torch.Size([1, 3, 14, 14])

layer.weight
'''
Out[11]: 
Parameter containing:
tensor([[[[ 0.1400, -0.1054, -0.2047],
          [ 0.0872, -0.0277,  0.2177],
          [-0.2424, -0.0359, -0.1245]]],
        [[[-0.0275, -0.1923, -0.0423],
          [ 0.2632, -0.0316,  0.2044],
          [ 0.2014, -0.2908,  0.3193]]],
        [[[-0.1514,  0.2244,  0.0760],
          [-0.1666, -0.0105,  0.1731],
          [ 0.2147,  0.1257,  0.0294]]]], requires_grad=True)

'''

layer.weight.shape
# Out[12]: torch.Size([3, 1, 3, 3])
layer.bias.shape
# Out[13]: torch.Size([3])