인공지능/공부

인공지능 MNIST - FCN

이게될까 2023. 12. 1. 02:28
728x90
728x90

저번에 했던 MNIST가 과제로 또 나왔다...
이번에는 발전 과정 까지 다 보고 싶어하셔서 천천히 다 해보았다.
pytorch는 어색해서 좀 주저했는데 이김에 많은 방법을 써봤다.

import torch
import torch.nn as nn
import torch.nn.functional as f
import torch.optim as optim
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import time
device= "cuda" if torch.cuda.is_available() else "cpu"
print(device)
trainset = dsets.MNIST(root='dataset/',
                       train=True,
                       transform= transforms.ToTensor(),
                       download = True)
testset = dsets.MNIST(root='dataset/',
                       train=False,
                       transform= transforms.ToTensor(),
                       download = True)
trainset.data = trainset.data/255
testset.data = testset.data/255

relu = nn.ReLU()
model=nn.Sequential(nn.Linear(784,400,bias =True),
                    nn.BatchNorm1d(400),
                    relu,
                    nn.Dropout(0.3),
                    nn.Linear(400,240,bias =True),
                    nn.BatchNorm1d(240),
                    relu,
                    nn.Dropout(0.3),
                    nn.Linear(240,120,bias =True),
                    nn.BatchNorm1d(120),
                    relu,
                    nn.Dropout(0.3),
                    nn.Linear(120,84,bias =True),
                    nn.Linear(84,40,bias =True),
                    nn.BatchNorm1d(40),
                    relu,
                    nn.Dropout(0.3),
                    nn.Linear(40,10,bias =True),
                    nn.Softmax(dim = 1)
                     ).to(device)
lr = 0.0001
epochs = 200
bathsize = 6000
dropout = 0.1
dataset=TensorDataset(trainset.data,trainset.targets)
dataloader = DataLoader(dataset, batch_size= bathsize,shuffle=True)
optimizer = optim.Adam(model.parameters(),lr=lr,betas=(0.9,0.999), weight_decay=0.002)
loss_graph=[]
start= time.time()
for k in range (epochs +1):
  for i ,sample in enumerate(dataloader) :
    (x,y) = sample
    x = x.reshape(bathsize,-1)
    optimizer.zero_grad()
    cost = f.cross_entropy(model(x.float().to(device)),y.to(device)).to(device)
    cost.backward()
    optimizer.step()
  print(k, cost.item())
  loss_graph.append(cost.item())
print("time : {} sec".format(time.time()-start))
plt.figure()
plt.plot(loss_graph)
plt.xlabel('Number of iterations')
plt.ylabel('loss_graph')
print((torch.argmax(model(testset.data.reshape(10000,-1).float().to(device)),dim=1).float()==testset.targets.to(device)).float().mean())
print((torch.argmax(model(trainset.data.reshape(60000,-1).float().to(device)),dim=1).float()==trainset.targets.to(device)).float().mean())

여태 제 코드를 많이 보셨다면 이제 이건 쉬울 것이다. 그래도 FCN으로 오버피팅 다 잡기는 힘드네..

네트워크 설명 특징 시간(s) 점수
단순 FCN에 에폭 20 레이어 4 낮은 학습률 57.8 62
에폭만 80으로 증가 학습 진전 X 220 72
레이어 2개 추가 학습 진전 X 247 75
ReLU추가, 에폭 40으로 감소, 배치 사이즈 증가 학습 점수 99에 비해 낮은 점수 30 97
BatchNorm1d, dropout 추가 학습 완료 X 32 97
에폭 증가 학습 완료 X 46 97
에폭 증가, regularization 추가 학습 완료 X 77 97
Regularization, dropout 감소 Train 점수 99.7 80 97
에폭 증가, Regularization, dropout 증가, 데이터 스케일링 Train 점수 99.6 174 97.7
에폭 증가, Regularization 증가 Train 점수 99.5 293 97.4
Regularization 증가                     Train 점수 99.5 302 97.5
Regularization 증가         언더피팅 304 78.7

내일은 CNN을 완료하고 제출!

728x90