2

다음은 RestNet-18의 Pytorch 구현입니다. https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py 다음은 ResNet-18의 구조입니다. 누구나 왜이 네트워크에 18 개의 레이어가 있는지 알 수 있습니까?ResNet-18의 레이어 양을 알려면 어떻게해야합니까?

당신의 출력에서 ​​
ResNet (
    (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False) 
    (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True) 
    (relu): ReLU (inplace) 
    (maxpool): MaxPool2d (size=(3, 3), stride=(2, 2), padding=(1, 1), dilation=(1, 1)) 
    (layer1): Sequential (
    (0): BasicBlock (
     (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True) 
    ) 
    (1): BasicBlock (
     (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True) 
    ) 
) 
    (layer2): Sequential (
    (0): BasicBlock (
     (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True) 
     (downsample): Sequential (
     (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False) 
     (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True) 
    ) 
    ) 
    (1): BasicBlock (
     (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True) 
    ) 
) 
    (layer3): Sequential (
    (0): BasicBlock (
     (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True) 
     (downsample): Sequential (
     (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False) 
     (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True) 
    ) 
    ) 
    (1): BasicBlock (
     (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True) 
    ) 
) 
    (layer4): Sequential (
    (0): BasicBlock (
     (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True) 
     (downsample): Sequential (
     (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False) 
     (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True) 
    ) 
    ) 
    (1): BasicBlock (
     (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True) 
     (relu): ReLU (inplace) 
     (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False) 
     (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True) 
    ) 
) 
    (avgpool): AvgPool2d (
) 
    (fc): Linear (512 -> 1000) 
) 
+0

실험을 통해 18 층으로 설계되었으므로 "왜"우리는 말할 수 없습니다. –

+0

감사합니다.하지만 CNN처럼 코드를 통해 레이어를 세는 방법이 있어야합니다. 우리는'__init __()'을 통해 레이어 수를 계산할 수 있지만 ResNet-18에는'layer1 ~ 4'가 있으며, 각 레이어는'_make_layer()'는 위의 출력과 마찬가지로 54 개의 레이어가 있습니다. – mcgG

+0

내가 원하는 것은 각 레이어의 그라디언트를 기록하는 것이므로 그물에 얼마나 많은 레이어가 있는지 알아야합니다. – mcgG

답변

1

, 우리는 20 개 회선 층 (한 7 × 7 전환, 16 × 3 전환, 플러스 다운 샘플링 3 × 1의 전환)이 있다는 것을 알 수 있습니다. 기본적으로 1x1 변환을 무시하고 fc (선형) 레이어를 계산하면 레이어 수는 18입니다.

그리고 grapht를 통해 pytorch에서 아키텍처를 시각화하는 방법을 https://gist.github.com/wangg12/f11258583ffcc4728eb71adc0f38e832 귀하의 아키텍처를 이해하는 데 도움이 될 것입니다.

+0

감사합니다. 따라서 레이어 수가 엄격하지 않습니까? – mcgG

+0

기본적으로 우리는 대개 회선 수와 완전히 연결된 레이어 수를 계산합니다. 그러나 resnet에서, 나는 지름길 회선 층이 계산되어야하는지 확신 할 수 없다. 그것은 저자의 정의에 달려있다. –