본문 바로가기

ML&DL/PyTorch

(18)
[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..
[PyTorch] 시계열 데이터를 위한 1D convolution과 1x1 convolution 오늘은 시계열 데이터처리에 많이 사용되는 1D convolution이 PyTorch에 어떻게 구현되어 있는지와 어떤 파라미터가 존재하는지 차원은 어떻게 계산하는 지를 정리해 보려고 한다. 자꾸 까먹는 나 자신을 위한 포스팅이 될 것 같다. 시작해보자! 간단한 1D convolution 예시 2D convolution이 가로,세로로 모두 이동하면서 output이 계산되는 것과 다르게 1D convolution 연산은 가로로만 이동하면서 output을 계산해낸다. 우리가 알고있는 신호처리에서의 convolution과 다르게 사실은 cross correlation 연산과 같다. 아래의 예시를 계산해보면 쉽게 이해할 수 있다. 직접 계산해보면 금방 이해할 것이다. (여기서 kernel은 filter라고도 부르며..
[PyTorch] torch.nn.KLDivLoss() 사용법과 예제 어쩌다보니 처음으로 KLDivergence를 loss로 사용하게 되었다. keras에서는 그냥 평범(?)하게 사용했으나 PyTorch에서는 우여곡절 끝에 제대로 loss가 떨어지는 것을 확인했다. 그래서 겸사겸사 기록해둔다. KLDivLoss 선언하기 처음엔 그냥 간단하게 선언을 했으나 reduction이라는 parameter가 mean으로 설정되어있는데 이렇게 설정되어 있으면 진짜 KLDivergence value를 뱉지 않는다고 한다. 그러므로 선언할 때부터 아래와 같이 선언해주어야 한다. 다음 버전에서는 이 부분을 개선하여 업데이트한다고 한다. import torch Loss = torch.nn.KLDivLoss(reduction='batchmean') 모델 정의하기 제대로 된 모델을 정의한 것은 ..
[PyTorch] numpy에서 tensor로 변환: Tensor, from_numpy함수의 차이/tensor에서 numpy로 변환: numpy함수 Numpy에서 Tensor로 PyTorch에서 Numpy array를 Tensor 자료형으로 바꾸는 일은 흔하게 이루어지는 일이다. 나같은 경우 음성신호를 입력으로 받아 Tensor로 변환하여 Dataset을 만드는데 이 연산을 사용한다. PyTorch의 2가지 변환함수와 그 차이점을 설명한다. torch.Tensor() vs torch.from_numpy() torch.Tensor() 는 Numpy array의 사본일 뿐이다. 그래서 tensor의 값을 변경하더라도 Numpy array자체의 값이 달라지지 않는다. 하지만 torch.from_numpy()는 자동으로 input array의 dtype을 상속받고 tensor와 메모리 버퍼를 공유하기 때문에 tensor의 값이 변경되면 Numpy array..