Skip to main content

테스트

과소/과대 적합

  • 과소적합(underfitting): 실제 패턴보다 모형이 단순
  • 과대적합(overfitting): 실제 패턴보다 모형이 복잡

데이터 분할

  • 데이터를 Training과 Testing으로 분할 (보통 8:2 또는 9:1)
  • 파라미터를 추정하는데는 많은 데이터가 필요하므로 Training을 크게
  • Testing은 모형들의 성능을 구별할 정도만 되면 충분하므로 작게
  • Training에 과적합되면 Testing에서 성능이 낮아짐
  • Training과 Testing의 데이터가 섞이지 않도록 유의

과적합의 진단

  • training set에서는 성능이 높지만 testing set에서는 성능이 낮을 경우
    • → overfitting 되었을 가능성이 높음
    • → 모형의 복잡도를 낮추는 방향으로 구조/하이퍼파라미터를 조정
  • training set에서도 성능이 낮을 경우
    • → underfitting이 되었을 가능성이 높음
    • → 모형의 복잡도를 높이는 방향으로 구조/하이퍼파라미터를 조정

테스트 데이터 다운로드

test_dataset = datasets.MNIST(
root='./data',
train=False, # 테스트용 데이터셋(이 부분만 달라짐)
download=True,
transform=transforms.ToTensor()
)

binary_test_dataset = torchutils.BinarySubset(test_dataset, 0, 1)

테스트 데이터 평가

test_loader = DataLoader(
binary_test_dataset, # 테스트 데이터
batch_size=BATCH_SIZE, # 32개씩
shuffle=False) # 섞지 말고

trainer.test(model, test_loader)

파라미터

weight = model.linear.weight.data # Linear 레이어의 가중치
w = weight.reshape(28, 28).detach().cpu().numpy() # 가중치를 28x28 이미지 형태로
plt.imshow(w, cmap='gray') # 시각화
  • 흰색: 1로 판단하는 데 영향을 주는 픽셀
  • 검은색: 0으로 판단하는 데 영향을 주는 픽셀

직접 손글씨 입력해보기

  • 그림판에서 직접 손글씨 입력
  • 크기 조정(픽셀, 28, 28, 가로세로 비율 X)
  • 오른쪽 하단 확대/축소로 확대
  • 색 채우기 (검은색)
  • 브러시(색 1 → 흰 색)
  • 검은 바탕에 흰 글씨로 0 또는 1
  • hand.png로 저장

손글씨 이미지 불러오기

import cv2 as cv
x = cv.imread('hand.png', cv.IMREAD_GRAYSCALE) # 이미지 불러오기

# 모형에 입력할 때는 (이미지 장수, 세로 길이, 가로 길이) 형태여야 함
# 한 장 짜리 이미지의 경우 0번 차원을 추가해야 함
x = np.expand_dims(x, 0) # 차원 추가 (28, 28) → (1, 28, 28)
x = torch.from_numpy(x).float() # 텐서로 변환
x = x / 255.0 # 정규화 [0~255] → [0~1]
model(x) # 모형 예측

차원의 추가 방법들

  • expand_dims
    np.expand_dims(x, 0) # 0번 차원 확장
  • new_axis
    x[np.newaxis, 0:28, 0:28] # 0번 차원에 새 축, 1, 2차원은 0~28번값
    x[np.newaxis, :, :] # 0번 차원에 새 축, 1, 2차원은 모든 값
    x[np.newaxis, ...] # 0번 차원에 새 축, 다른 차원은 모든 값
  • reshape
    x.reshape(1, 28, 28) # 모양을 1, 28, 28로 변경

퀴즈