8.2. Networks Using Blocks (VGG)
* VGG (Very Deep Convolutional Networks)
특징
- 심플한 네트워크 구조: 필터의 크기는 모두 3*3으로 고정되어 있으며, 모든 합성곱 계층의 stride는 1, padding는 1
- 깊은 네트워크
- 작은 필터 사용: VGG는 3*3의 작은 합성곱 필터를 반복적으로 쌓아 사용. 작은 필터를 여러 번 사용하는 대신, 큰 필터를 한 번 사용하는 것보다 더 좋은 성능을 보임.
- Pooling 계층: 일정한 간격으로 Max pooling을 사용하여 이지 크기를 축소
- Fully Connected layer: 마지막에는 여러 개의 Fully connected 계층을 통해 최종 출력을 생성
- Dropout: 일부 뉴런을 무작위로 비활성화하여 모델이 특정 뉴런에 너무 의존하지 않도록 조절
장점
- 단순한 구조 덕분에 네트워크 설계가 쉽고, 새로운 작업이나 데이터셋에 적용시키기 용이
- 작은 3*3 필터를 반복적으로 사용하여 큰 필터 대신 더 복잡한 비선형성 학습 가능
단점
- 매우 깊은 네트워크로 인해 메모리 사용량과 계산량이 크게 증가
- GPU 메모리를 많이 요구
- 학습 속도가 느리며, 많은 파라미터 때문에 더 많은 계산 자원이 필요
8.2.1. VGG Blocks
import torch
from torch import nn
from d2l import torch as d2l
def vgg_block(num_convs, out_channels):
layers = []
for _ in range(num_convs):
layers.append(nn.LazyConv2d(out_channels, kernel_size=3, padding=1))
layers.append(nn.ReLU())
layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
return nn.Sequential(*layers)
8.2.2. VGG Network
class VGG(d2l.Classifier):
def __init__(self, arch, lr=0.1, num_classes=10):
super().__init__()
self.save_hyperparameters()
conv_blks = []
for (num_convs, out_channels) in arch:
conv_blks.append(vgg_block(num_convs, out_channels))
self.net = nn.Sequential(
*conv_blks, nn.Flatten(),
nn.LazyLinear(4096), nn.ReLU(), nn.Dropout(0.5),
nn.LazyLinear(4096), nn.ReLU(), nn.Dropout(0.5),
nn.LazyLinear(num_classes))
self.net.apply(d2l.init_cnn)
VGG(arch=((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))).layer_summary(
(1, 1, 224, 224))
8.2.3. Training
model = VGG(arch=((1, 16), (1, 32), (2, 64), (2, 128), (2, 128)), lr=0.01)
trainer = d2l.Trainer(max_epochs=10, num_gpus=1)
data = d2l.FashionMNIST(batch_size=128, resize=(224, 224))
model.apply_init([next(iter(data.get_dataloader(True)))[0]], d2l.init_cnn)
trainer.fit(model, data)
1. VGG와 AlexNet의 계산 성능 비교
1) 파라미터 수 비교
AlexNet: 약 6천만 개 (얕은 신경망 구조)
VGG-16: 약 1억 3천 8백만 개 (깊은 신경망 구조)
2) 합성곱 계층과 완전 연결 계층에서 연산량 비교
AlexNet: 상대적으로 큰 필터를 사용. 계층의 수가 적음. 연산량 적음
VGG: 많은 합성곱 계층. 필터 크기가 작지만 깊이가 깊어 연산량 증가
3) 완전 연결 계층에서 계산비용 줄이기
VGG는 완전 연결 계층에서 드롭아웃을 사용하여 계산량을 줄이고, 과적합을 방지
2.
VGG 네트워크에서 8개의 블록만 나타나지만 실제로는 총 11개의 레이어가 존재. 남은 3개의 레이어는 보조적인 역할을 하는 완전 연결 계층과 드롭아웃 계층. 이는 네트워크의 마지막 부분에서 주로 사용되며, 분류 작업을 위한 최종 레이어로 작동
3.
블록당 합성곱 계층 수를 조절하여 모델 구성 가능
4. Fashion-MNIST 데이터셋의 해상도를 8배로 업샘플링
Fashion-MNIST 데이터셋의 이미지는 28*28 크기인데, 이를 224*224로 업샘플링 하는 것은 많은 계산 비용이 필요. 이를 해결하기 위해서는 입력 해상도를 56*56 또는 84*84 같은 중간 크기로 변환. 이를 통해 계산 효율성을 유지하며 성능 저하를 방지.