Pytorch를 통해 모델을 생성하는 두 가지 방법
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)
)
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()
)
)