목록분류 전체보기 (56)
개발자의 스터디 노트
1. 테스트 셋에서 평가하기 - MLP의 정확도는 약 50% 정도였습니다. CNN 모델이 어느 정도의 성능 향상이 있었는지 테스트 셋으로 평가해봅시다. classifier.load_state_dict(torch.load(train_state['model_filename'])) classifier = classifier.to(args.device) dataset.class_weights = dataset.class_weights.to(args.device) loss_func = nn.CrossEntropyLoss(dataset.class_weights) dataset.set_split('test') batch_generator = generate_batches(dataset, batch_size=args...
모델 훈련은 앞서 포스팅했던 과정을 그대로 답습합니다. 1. 학습에 필요한 메서드 생성 def make_train_state(args): return {'stop_early': False, 'early_stopping_step': 0, 'early_stopping_best_val': 1e8, 'learning_rate': args.learning_rate, 'epoch_index': 0, 'train_loss': [], 'train_acc': [], 'val_loss': [], 'val_acc': [], 'test_loss': -1, 'test_acc': -1, 'model_filename': args.model_state_file} def update_train_state(args, model, tra..
MLP로 만든 예제와 대부분의 내용은 같지만 모델 구성과 벡터 변환 과정이 다릅니다. 모델 입력은 원-핫 표현이 아니라 위치정보가 포함된 원-핫 벡터의 행렬입니다. 이렇게 하면 CNN이 나열된 문자를 더 잘 볼 수 있고 원-핫 인코딩에서 잃었던 순서 정보를 인코딩할 수 있습니다. 1. SurnameDataset 원-핫 벡터의 행렬을 구성하기 위해 데이터셋 클래스가 가장 킨 성씨를 찾아 이를 SurnameVectorizer 클래스의 객체에 행렬의 행 크기로 전달하도록 구현되었습니다. 원-핫 행렬의 크기를 제어하는 데 데이터셋에서 가장 긴 성씨를 사용하는 이유는 두 가지입니다. 첫째. 성씨 행렬의 각 미니 배치는 3차원 텐서입니다. 따라서 크기가 모두 같아야 합니다. 둘째. 데이터셋에서 가장 긴 성씨를 사용..
CNN은 공간상의 부분 구조를 감지하는 데 적합한( 그래서 의미 있는 공간상의 부분 구조를 만드는) 신경망입니다. CNN 은 소수의 가중치를 사용해 입력 데이터 텐서를 스캔하는 식으로 이를 수행합니다. 스캔하면서 부분 구조의 유무를 표현하는 출력 텐서를 만듭니다. 2차원 합성곱 연산. 입력 행렬이 커널 하나와 합성곱 연산을 수행하여 출력 행렬(또는 특성 맵)을 만듭니다. 합성곱은 입력 행렬의 위치마다 커널을 적용합니다. 합성곱 연산을 수행할 때마다 커널과 입력 행렬의 각 원소를 곱한 후 모두 더합니다. 1. 합성곱 연산의 차원 - 파이토치에서는 1차원, 2차원, 3차원 합성곱이 가능하며 각각 Conv1d, Conv2d, Conv3d 클래스로 구현되었습니다. - 1차원 합성곱은 각 타임 스텝에 특성 벡터가..
심층 신경망 모델(즉 층이 여럿인 모델)에서는 드롭아웃(dropout)이라고 하는 구조적인 규제 방법이 매우 중요합니다. 드롭아웃이란 무엇일까요? https://heytech.tistory.com/127 [딥러닝] Drop-out(드롭아웃)은 무엇이고 왜 사용할까? 안녕하세요, 오늘은 딥러닝에 있어서 Generalization 기법 중 하나인 Drop-out(드롭아웃)에 대해 알아봅니다. 그럼 바로 시작하죠! 학습목표 💡 드롭아웃(Drop-out)이 무엇이고, 왜 사용하는지에 대해 이 heytech.tistory.com 위 포스팅을 참고하면 드롭아웃을 사용함으로써 정규화가 잘된 특정 Feature만을 과도하게 학습함으로써 발생할수 있는 과대적합(Overfitting)을 방지하여 훈련의 안정성을 기대할 수..
MLP로 학습한 모델을 평가해보도록 하겠습니다. 평가는 테스트 데이터 셋으로 진행합니다. 훈련 데이터의 정확도가 테스트 데이터의 정확도보다 높게 나옴을 알 수 있습니다. 모델은 항상 훈련하는 데이터에서 더 높은 성능이 나옵니다. 따라서 훈련 세트의 성능이 새로운 데이터에도 적용된다고 생각해서는 안됩니다. 1. 테스트 셋 데이터에서 평가하기 # 가장 좋은 모델을 사용해 테스트 세트의 손실과 정확도를 계산합니다 classifier.load_state_dict(torch.load(train_state['model_filename'])) classifier = classifier.to(args.device) dataset.class_weights = dataset.class_weights.to(args.devi..
지난번 포스팅에서 모델을 만들기 위해 Vocabulary, Vectorizer, DataLoader를 만들고 성씨 분류 학습 모델을 만들었습니다. 이번 학습의 출력은 확률로 변환할 수 있는 다중 클래스에 대한 예측 벡터입니다. 이런 출력에 사용할 수 있는 손실 함수는 CrossEntropyLoss()입니다. 주피터 노트북에서 실습할때 지난번 포스팅에 이어서 실습해야 에러 없이 실습할 수 있습니다. 1. 훈련에 앞서 헬퍼 함수를 먼저 생성하겠습니다. def make_train_state(args): return {'stop_early': False, 'early_stopping_step': 0, 'early_stopping_best_val': 1e8, 'learning_rate': args.learning..
성씨 분류를 하기 위하여 데이터를 다운 받습니다. https://www.kaggle.com/pritioli/suranames/tasks?select=surnames_with_splits.csv suranames www.kaggle.com 라이트 버전인 surnames_with_splits.csv 파일을 다운로드 하였습니다. 우선 소스코딩에 필요한 패키지를 import 하겠습니다. from argparse import Namespace from collections import Counter import json import os import string import numpy as np import pandas as pd import torch import torch.nn as nn import torc..