(Pytorch-Deep Learning Series) 파이 토치 컨벌루션 레이어와 풀링 레이어의 출력 크기 계산 공식에 대한 자세한 설명

파이 토치 컨벌루션 레이어와 풀링 레이어의 출력 크기 계산 공식에 대한 자세한 설명

컨벌루션 신경망의 구조를 설계하려면 레이어 간의 입력 및 출력 크기를 일치시켜야하므로 출력 크기를 더 잘 계산해야합니다.

먼저 공식을 나열하십시오.

卷积后,池化后尺寸计算公式:
(图像尺寸-卷积核尺寸 + 2*填充值)/步长+1
(图像尺寸-池化窗尺寸 + 2*填充值)/步长+1
  • 1
  • 2

즉 :

卷积神将网络的计算公式为:
N=(W-F+2P)/S+1
其中
N:输出大小
W:输入大小
F:卷积核大小
P:填充值的大小
S:步长大小
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8

Conv2d 예제 (계산 방법을 설명하기 위해 나중에 예제가 제공됨) :

여기에 사진 설명 삽입
`
여기에 사진 설명 삽입

class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
  • 1
卷积一层的几个参数:
in_channels=3:表示的是输入的通道数,RGB型的通道数是3.
out_channels:表示的是输出的通道数,设定输出通道数(这个是可以根据自己的需要来设置的)
kernel_size=12:表示卷积核的大小是12x12的,也就是上面的 F=12
stride=4:表示的是步长为4,也就是上面的S=4
padding=2:表示的是填充值的大小为2,也就是上面的P=2
  • 1
  • 2
  • 4
  • 5
  • 6

예 :

cove1d : 텍스트 데이터에 사용되며 너비 만 convolved이고 높이는 convolved가 아닙니다.
cove2d : 이미지 데이터에 사용되며 너비와 높이는 모두 convolved입니다.

import torch
from torch.autograd import Variable
#torch.autograd提供了类和函数用来对任意标量函数进行求导。
import torch.nn as nn
import torch.nn.functional as F
class MNISTConvNet(nn.Module):
    def __init__(self):
        super(MNISTConvNet, self).__init__()
        '''
这是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。
也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
        '''
#定义网络结构
        self.conv1 = nn.Conv2d(1, 10, 5)
        self.pool1 = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(10, 20, 5)
        self.pool2 = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)
    def forward(self, input):
        x = self.pool1(F.relu(self.conv1(input)))
        x = self.pool2(F.relu(self.conv2(x))).view(320)
        x = self.fc2(self.fc1(x))
        return x

net = MNISTConvNet()
print(net)
input = Variable(torch.randn(1, 1, 28, 28))
out = net(input)
print(out.size())
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

이 예에서는 네트워크 구조 부분을 추출합니다.

        self.conv1 = nn.Conv2d(1, 10, 5)
        self.pool1 = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(10, 20, 5)
        self.pool2 = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)
    def forward(self, input):
        x = self.pool1(F.relu(self.conv1(input)))
        x = self.pool2(F.relu(self.conv2(x))).view(320)
        x = self.fc2(self.fc1(x))
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

네트워크 구조는 다음과 같습니다.

conv2d--maxpool2d--conv2d--maxpool2d--fullyconnect--fullyconnect
  • 1

입력 이미지 크기는 다음과 같습니다. input = Variable (torch.randn (1, 1, 28, 28))
, 28 * 28 단일 채널 이미지, 즉 :1*28*28

다음으로, 네트워크의 각 계층의 입력과 출력을 계층 적으로 분석합니다.

(1) conv2d (1,10,5)

N:输出大小
W:输入大小	28*28
F:卷积核大小	5*5
P:填充值的大小	0默认值
S:步长大小	1默认值
  • 1
  • 2
  • 4
  • 5
N=(W-F+2P)/S+1=(28-5 + 2*0)/1 + 1 = 24
输出为:10*24*24
  • 1
  • 2

Conv2d (입력 채널 수, 출력 채널 수, kernel_size (길이 및 너비)) 컨볼 루션 커널이 정사각형이면 하나만 쓸 수 있습니다. 컨볼 루션 커널이 정사각형아닌 경우 길이와 너비는 다음과 같이 작성해야 합니다. :

self.conv1 = nn.Conv2d(2, 4, (5,2))
  • 1

(2) MaxPool2d (2, 2)
MaxPool 최대 풀링 계층, 컨볼 루션 신경망에서 풀링 계층의 역할은 기능 융합 및 차원 감소입니다. 풀링도 유사한 컨볼 루션 작업이지만 풀링 계층의 모든 매개 변수는 하이퍼 파라미터이며 학습 할 수 없습니다. Maxpooling은 국부적으로 불변하며 모델 매개 변수를 줄이면서 중요한 특징을 추출 할 수 있으므로 모델 과적 합을 줄일 수 있습니다. 눈에 띄는 특징 만 추출하고 중요하지 않은 정보는 버려서 모델의 매개 변수를 줄여 오버 피팅 발생을 어느 정도 완화 할 수 있습니다.

class torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
  • 1
N:输出大小
W:输入大小	24*24
F:卷积核大小	5*5
P:填充值的大小	0默认值
S:步长大小	1默认值
  • 1
  • 2
  • 4
  • 5
N=(W-F+2P)/S+1=(24-2 + 2*0)/2 + 1 = 12
输出为:10*12*12
  • 1
  • 2

(3) conv2d (10,20,5)

N:输出大小
W:输入大小	12*12
F:卷积核大小	5*5
P:填充值的大小	0默认值
S:步长大小	1默认值
  • 1
  • 2
  • 4
  • 5
N=(W-F+2P)/S+1=(12-5 + 2*0)/1 + 1 = 8
输出为:20*8*8
  • 1
  • 2

(4) MaxPool2d (2, 2)

N:输出大小
W:输入大小	8*8
F:卷积核大小	5*5
P:填充值的大小	0默认值
S:步长大小	1默认值
  • 1
  • 2
  • 4
  • 5
N=(W-F+2P)/S+1=(8-2 + 2*0)/2 + 1 = 4
输出为:20*4*4
  • 1
  • 2

(5) 리니어 완전 연결 (320, 50)

输入:20*4*4=320
输出:50
  • 1
  • 2

(6) 리니어 완전 연결 (50, 10)

输入:50
输出:10
  • 1
  • 2

따라서 전체 예제의 훈련 프로세스 데이터 흐름은 다음과 같습니다.

    def forward(self, input):
        x = self.pool1(F.relu(self.conv1(input)))
        x = self.pool2(F.relu(self.conv2(x))).view(320)
        x = self.fc2(self.fc1(x))
  • 1
  • 2
  • 4

활성화 함수 Relu는 신경망에서 역할을합니다 : 가중 입력의 비선형 조합은 비선형 결정 경계를 생성합니다.
간단히 말하면 비선형 효과를 증가시키는 것입니다.
심층 컨벌루션 신경망에서 활성화 함수를 사용하면 주로 시그 모이 드 함수로 인한 기울기 소실 문제를 해결하기 위해 비선형 성이 증가합니다.

추천

출처blog.csdn.net/c2a2o2/article/details/109282583