1 2 3 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| 순차적으로 'A'의 값이 for문을 통해 들어가면 layers에 어떻게 layer가 쌓이는지 누적시키며 따라가보자. (batch_norm=False)인 상황이다. 1. 처음에 64 값을 받으면, layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True) ] 가 되며 in_channels가 입력받은 64로 바뀌게된다!
2. 'M' 을 입력받으면, MaxPool2d가 들어가며 in_channels값은 바뀌지 않는다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2) ]
3. 다시 128 값을 받으면, 처음 64를 입력받았을때와 마찬가지로 ```Conv2d```와 ```ReLU```가 추가되며 in_channels는 128로 바뀌게된다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(64, 128, kernel_size=3, padding=1) nn.ReLU(inplace=True) ]
4. 다음으로 'M'을 입력받으면, 두번째 단계와 마찬가지로 MaxPool2d가 들어가고 in_channels는 유지된다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(64, 128, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2) ]
5. 다음으로 256 값을 두번 연속해서 받으면, 첫번째 단계가 두번 실행되는것과 같다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(64, 128, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(128, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(256, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True) ]
6. 세번째 'M'을 입력받아서 다음과 같다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(64, 128, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(128, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(256, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2) ]
7. 위의 과정을 통해 익숙해졌으므로 [512, 512, 'M'] 입력을 한번에 살펴보자. 세 개의 입력이 들어오면 다음과 같이 layers가 쌓이게된다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(64, 128, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(128, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(256, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(256, 512, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(512, 512, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2) ]
8. 마지막으로 다시 한번 [512, 512, 'M'] 입력을 받는다. 따라서 최종적으로는 다음과 같은 layers가 생성된다. layers = [ conv2d= nn.Conv2d(3, 64, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(64, 128, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(128, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(256, 256, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(256, 512, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(512, 512, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2)
conv2d= nn.Conv2d(512, 512, kernel_size=3, padding=1) nn.ReLU(inplace=True)
conv2d= nn.Conv2d(512, 512, kernel_size=3, padding=1) nn.ReLU(inplace=True)
nn.MaxPool2d(kernel_size=2, stride=2) ]
|