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
'인공지능 > 공부' 카테고리의 다른 글
인공지능 MNIST - CNN pytorch validation, 정규화 (40) | 2023.12.02 |
---|---|
인공지능 MNIST - CNN (36) | 2023.12.01 |
센서신호, FFT, STFT data를 통해 하중 예측하기 -3 스케쥴러 (34) | 2023.11.30 |
센서신호, FFT, STFT data를 통해 하중 예측하기 -2 LSTM (33) | 2023.11.30 |
센서신호, FFT, STFT data를 통해 하중 예측하기 (49) | 2023.11.30 |