본문 바로가기

ML&DL

(32)
[PyTorch] Dataset과 Dataloader 설명 및 custom dataset & dataloader 만들기 Custom dataset/dataloader 가 필요한 이유 점점 많은 양의 data를 이용해서 딥러닝 모델을 학습시키는 일이 많아지면서 그 많은 양의 data를 한번에 불러오려면 시간이 오래걸리는 것을 넘어서서 RAM이 터지는 일이 발생한다. 데이터를 한번에 다 부르지 않고 하나씩만 불러서 쓰는 방식을 택하면 메모리가 터지지 않고 모델을 돌릴 수 있다. 그래서 모든 데이터를 한번에 불러놓고 쓰는 기존의 dataset말고 custom dataset을 만들어야할 필요가 있다. 또한 길이가 변하는 input에 대해서 batch를 만들때나 batch 묶는 방식을 우리가 정해주어야할 때 dataloader에서 batch를 만드는 부분을 수정해야할 필요가 있어 custom dataloader를 사용한다. 이번 ..
[PyTorch] Weight Decay (L2 penalty) Weight decay를 하는 이유 한마디로 말하자면 overfitting을 방지하기 위해 weight decay를 한다. overfitting은 train dataset에 과도하게 맞춰져서 generalization성능이 낮은 것을 의미한다. 그래서 처음 본 test set에서 성능이 안좋게 나오는 경우이다. overfitting을 막고 test set에서도 좋은 성능을 내게 하기 위한 여러 방법들 중 하나가 weight decay이다. Weight decay와 L2 penalty Weight decay는 모델의 weight의 제곱합을 패널티 텀으로 주어 (=제약을 걸어) loss를 최소화 하는 것을 말한다. 이는 L2 regularization과 동일하며 L2 penalty라고도 부른다. (L2 re..
[PyTorch] Gradient clipping (그래디언트 클리핑) Gradient clipping을 하는 이유 주로 RNN계열에서 gradient vanishing이나 gradient exploding이 많이 발생하는데, gradient exploding을 방지하여 학습의 안정화를 도모하기 위해 사용하는 방법이다. Gradient clipping과 L2norm 내용이 사실 굉장히 간단하다. clipping이란 단어에서 유추할 수 있듯이 gradient가 일정 threshold를 넘어가면 clipping을 해준다. clipping은 gradient의 L2norm(norm이지만 보통 L2 norm사용)으로 나눠주는 방식으로 하게된다. threshold의 경우 gradient가 가질 수 있는 최대 L2norm을 뜻하고 이는 하이퍼파라미터로 사용자가 설정해주어야 한다. 논문에..
[PyTorch] squeeze, unsqueeze함수: 차원 삭제와 차원 삽입 squeeze함수 squeeze함수는 차원이 1인 차원을 제거해준다. 따로 차원을 설정하지 않으면 1인 차원을 모두 제거한다. 그리고 차원을 설정해주면 그 차원만 제거한다. Python 코드 import torch x = torch.rand(3, 1, 20, 128) x = x.squeeze() #[3, 1, 20, 128] -> [3, 20, 128] 주의할 점은 생각치도 못하게 batch가 1일 때 batch차원도 없애버리는 불상사가 발생할 수있다. 그래서 validation단계에서 오류가 날 수 있기 때문에 주의해서 사용해야 한다. import torch x = torch.rand(1, 1, 20, 128) x = x.squeeze() # [1, 1, 20, 128] -> [20, 128] x2 =..
[PyTorch] Tensor 합치기: cat(), stack() 실험이 돌아가는 동안 심심하니까 하는 포스팅. PyTorch에서 tensor를 합치는 2가지 방법이 있는데 cat과 stack이다. 두가지는 현재 차원의 수를 유지하느냐 확장하느냐의 차이가 있다. 그림과 코드를 통해 사용법을 알아보자. Cat함수란? cat함수는 concatenate를 해주는 함수이고 concatenate하고자 하는 차원을 증가시킨다 (차원의 갯수는 유지되고 해당 차원이 늘어난다.. 설명이 애매하네 코드 참고). concatenate하고자하는 차원을 지정해주면 그 차원으로 두 tensor의 차원을 더한 값으로 차원이 변경된다. concatenate하고자하는 dimension을 지정해주지 않으면 default=0으로 설정된다. 자주 사용하는 용도로는 network 내에서 다른 두 featu..
[PyTorch] 시계열 데이터를 위한 RNN/LSTM/GRU 사용법과 팁 순차적으로 들어오는 정보들의 맥락(context)을 잘 기억하는 딥러닝의 구조로 RNN계열이 있다. 오늘은 RNN이나 LSTM을 처음 사용하는 초심자를 위한 간단한 pyTorch에서의 RNN/LSTM/GRU layer 사용법을 정리한다. RNN 내부 구조보다 input, output의 차원에 초점을 둔 설명이 될 것이다. 그럼 시작! RNN/LSTM/GRU 먼저 RNN/LSTM/GRU 각각의 cell은 모두 동일한 파라미터를 가지고 있기 때문에 LSTM을 기준으로 PyTorch에서 어떻게 사용하는지 그리고 파라미터는 무엇이 있는 지 하나씩 알아보자. import torch.nn as nn lstm = nn.LSTM(input_size, hidden_size, num_layers, bias=True, ba..
[PyTorch] 리눅스환경에서 특정 GPU만 이용해 Multi GPU로 학습하기 연구실에서 다같이 연구를 하다보니 같은 서버에 GPU를 나눠서 사용해야 한다. 그럴 때 어떻게 나눠쓸 수 있을까? CUDA_VISIBLE_DEVICES를 이용해서 내가 현재 볼 수 있는 GPU를 한정시키는 방법이 있다. 그래서 특정 GPU들만 이용해서 Multi GPU로 모델을 학습할 수 있다. 예를 들면, 만약 2,3번만 보이게 설정했다면 걔네를 GPU 0번과 1번으로 인식하여 두 GPU만을 이용해서 학습하게 된다. 1) 터미널 창에서 GPU를 지정하여 python파일을 실행시킨다. model = torch.nn.DataParallel(model) model.cuda() CUDA_VISIBLE_DEVICES = 2,3 python train.py #터미널창 2) 코드내부에서 GPU를 지정해서 실행시킨다..
[PyTorch] 시계열 데이터를 위한 다양한 Normalization기법 (BatchNorm1d, GroupNorm 사용법) Normalization Neural network의 깊이가 점점 깊어질수록 학습이 안정적으로 되지 않는 문제가 발생한다. 이런 학습의 불안정화의 원인으로 'internal covariance shift'가 언급되었다. 이는 딥러닝에서 각 layer를 지나면서, inner representation의 distribution이 달라지는 현상을 말한다. 그러므로 layer를 지날 때 마다 변하는 데이터 분포의 scale을 맞춰주는 과정을 통해 안정된 학습을 보장할 수 있는데 이러한 방법을 Normalization이라고 한다. 기본적인 정규화로 표준정규분포를 맞춰주는 방법을 생각할 수 있을 것이다. 데이터의 범위를 정한다. (이 범위에 따라 batch normalization/ layer normalizati..