앞에 import 한 내용, dataloader은 같은 내용이므로 생략한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size = 5)
self.conv2 = nn.Conv2d(10, 20, kernel_size = 5)
self.mp = nn.MaxPool2d(2)
self.fc = nn.Linear(320, 10)
def forward(self, x):
in_size = x.size(0)
x = F.relu(self.mp(self.conv1(x)))
x = F.relu(self.mp(self.conv2(x)))
x = x.view(in_size, -1)
x = self.fc(x)
return F.log_softmax(x)
model = Net()
|
CNN 모델 구성 코드
전체적인 모델 그림
MaxPool2d(2) => Pooling window 크기가 2*2
MaxPooling : Kernel size안에서 제일 큰 수를 선택
AvgPooling : Kernel size안에서 평균 값을 선택
Conv2d(in_channel, out_channel, kernel_size)
MNIST는 흑백이미지이므로 in_channel이 1이다. 따라서 처음의 Conv2d의 in_channel은 1로 설정을 해야한다. 만약에 색상이 있는 이미지라면 RGB이므로 3이 될꺼같다.
13번째 줄에서는 view()함수를 사용해서 linear하게 변환해줌
김성훈 교수님 강의를 보다가
Fully connected neural net 이랑 Locally connected neural net이라는걸 알게됐는데
fully connected 같은 경우에는 모든 weight를 고려해서 하나의 노드를 만드는 편에 비해 locally connected는 특정 부분의 weight만을 따져서 fully connected보단 좀더 유연함+ 계산량의 장점으로 인해 CNN 에선 Locally connected를 사용함.
1
|
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum = 0.5)
|
optimizer는 SGD를 사용했다.
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
|
def train(epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data. target = Variable(data), Variable(target)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
if batch_idx % 10 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.data[0]))
def test():
model.eval()
test_loss = 0
correct = 0
for data, target in test_loader:
data, target = Variable(data, volatile=True), Variable(target)
output = model(data)
# sum up batch loss
test_loss += F.nll_loss(output, target, size_average=False).data[0]
# get the index of the max log-probability
pred = output.data.max(1, keepdim=True)[1]
correct += pred.eq(target.data.view_as(pred)).cpu().sum()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
|
Loss함수는 nll_loss를 사용하였고. train과 test함수는 앞에서 DNN 모델과 비슷해서 넘어가도록 하겠다.
[출저]: https://github.com/hunkim/PyTorchZeroToAll/blob/master/10_1_cnn_mnist.py
'Data > Data Science' 카테고리의 다른 글
[SQL] Coalesce 함수를 이용한 NULL값 처리 (0) | 2019.01.21 |
---|---|
[Pytorch] CrossEntropy, BCELoss 함수사용시 주의할점 (0) | 2018.11.07 |
[Pytorch] MNIST DNN 코드 작성 & 공부 (0) | 2018.10.04 |
[RNN]Recurrent Neural Networks (0) | 2018.03.08 |
[Tensorflow] 텐서플로우를 이용한 간단한 RNN 코딩 (0) | 2018.03.02 |