지도학습: 합성곱 신경망 (CNN) + 모델 생성하는 다른 방법

pppanghyun·2022년 7월 14일
0

Pytorch 기본

목록 보기
9/21

Pytorch를 통해 모델을 생성하는 두 가지 방법

1. 기존 방법 (이전 포스팅)

torch.nn을 사용해서 layer 별로 생성하고 forward에 이를 집어넣어서 학습

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5) # 입력 채널수 3, 출력 채널수 6, 필터크기 5x5 , stride=1(defualt)
        self.pool1 = nn.MaxPool2d(2, 2)  # 필터크기 2, stride=2
        self.conv2 = nn.Conv2d(6, 16, 5) # 입력 채널수 6, 출력 채널수 16, 필터크기 5x5 , stride=1(defualt)
        self.pool2 = nn.MaxPool2d(2, 2) # 필터크기 2, stride=2
        self.fc1 = nn.Linear(16 * 5 * 5, 120) # 5x5 피쳐맵 16개를 일렬로 피면 16*5*5개의 노드가 생성 
        									  # 반드시 같아야함
        self.fc2 = nn.Linear(120, 10) # 120개 노드에서 클래스의 개수인 10개의 노드로 출력

    def forward(self, x):
        x = self.pool1(F.relu(self.conv1(x))) # conv1 -> ReLU -> pool1
        x = self.pool2(F.relu(self.conv2(x))) # conv2 -> ReLU -> pool2
        x = x.view(-1, 16 * 5 * 5) # 5x5 피쳐맵 16개를 일렬로 만든다.
        x = F.relu(self.fc1(x)) 
        x = self.fc2(x)

        return x

net = Net().to(device) # 모델 선언
print(net) # 피쳐의 크기: 32 -> 28 ->14 -> 10 -> 5

#result
Net(
  (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
  (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
  (pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (fc1): Linear(in_features=400, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=10, bias=True)
)

2. 이번 방법

Net을 만들고 이전 방법의 fully connected 부분을 classifier로 별도 생성
forward 부분이 간편해짐

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        
        self.feature_extraction = nn.Sequential(nn.Conv2d(3, 6, 5), 
                                                nn.ReLU(),
                                                nn.MaxPool2d(2, 2), 
                                                nn.Conv2d(6, 16, 5),
                                                nn.ReLU(),
                                                nn.MaxPool2d(2, 2))
        
        self.classifier = nn.Sequential(nn.Linear(16 * 5 * 5, 120), # fc 부분을 classifier라고 말함
                                        nn.ReLU(),
                                        nn.Linear(120, 10))
                                        
    def forward(self, x):
        x = self.feature_extraction(x)
        x = x.view(-1, 16 * 5 * 5) # 5x5 피쳐맵 16개를 일렬로 만든다.
        x = self.classifier(x)

        return x

net = Net().to(device) # 모델 선언
print(net) # 32 -> 28 ->14 -> 10 -> 5

# result
Net(
  (feature_extraction): Sequential(
    (0): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (3): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
    (4): ReLU()
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (classifier): Sequential(
    (0): Linear(in_features=400, out_features=120, bias=True)
    (1): ReLU()
    (2): Linear(in_features=120, out_features=10, bias=True)
    (3): ReLU()
  )
)

결국 개인차가 있으니 본인 하고싶은대로 작성하면 됨!!

profile
pppanghyun

0개의 댓글