Python 83

[Pytorch] BCELoss, BCEWithLogitsLoss, CrossEntropyLoss

Contents PyTorch 에서는 이진 분류(Binary Classification)를 할 때 목적 함수 혹은 손실 함수로 사용할 수 있는 BCELoss와 BCEWithLogitLoss 가 존재한다. 두 함수는 모두 모델이 예측한 값과 실제 값 간의 차이를 비교하는 함수지만, 조금 다른 방식으로 계산된다. 두 함수의 차이점에 대해서 알아보자. BCELoss BCELoss는 모델의 구조 상에 마지막 Layer가 Sigmoid 혹은 Softmax로 되어 있는 경우 이를 사용한다. 즉, 모델의 출력이 각 라벨에 대한 확률값으로 구성되었을 때 사용이 가능하다. import torch import torch.nn as nn m = nn.Sigmoid() bce_criterion = nn.BCELoss() ta..

Python/Pytorch 2022.09.03

[Algorithm] sort()와 sorted()의 차이점

Contents 파이썬에서 리스트(List)를 정렬할 때 주로 사용하는 함수는 sort()와 sorted()가 있다. 두 개의 함수는 둘 다 정렬을 할 때 사용하지만 조금씩 사용하는 방법의 차이가 있다. 두 함수의 차이점에 대해서 알아보자. sorted sorted()의 경우 정렬할 때 쓰는 함수이며, 숫자 뿐만 아니라 문자까지도 정렬이 가능하다. 그러나, 문자를 정렬할 경우 리스트 구조로 반환이 되기 때문에 join 함수를 사용해서 다시 합쳐주어야 한다. a = [2, 5, 1, 9, 7] sorted(a) # [1, 2, 5, 7, 9] b = 'zbdaf' sorted(b) # ['a', 'b', 'd', 'f', 'z'] ''.join(sorted(b)) # 'abdfz' sort sort 함수는..

Python/Algorithm 2022.08.18

[Algorithm] List, Dictionary의 시간 복잡도

Contents 코딩 테스트를 하다보면 시간 복잡도를 고려하지 않아서 발생하는 시간 초과 문제에 직면할 때가 있다. 코딩 테스트에서는 리스트(List) 구조를 많이 사용하는데, 리스트에 사용할 수 있는 함수 혹은 주요 연산들의 시간 복잡도가 어느 정도인지 알아보자. List 연산 시간 복잡도 설명 $\text{len(a)}$ O(1) 전체 요소의 개수를 리턴한다. $\text{a[i]}$ O(1) index $i$의 요소를 가져온다. $\text{a[i:j]}$ O(k) index $i$부터 $j-1$까지의 길이만큼 $k$개 요소를 가져온다. 객체 $k$개에 대한 조회가 필요하기 때문에 O($k$) $\text{element in a}$ O(n) 요소가 존재하는지 확인하는 경우 순차 탐색을 해야하기 때문..

Python/Algorithm 2022.08.18

[Pandas] Pandas에서 tqdm 사용하기

tqdm을 사용할 때는 tqdm.tqdm이나 tqdm.trange를 사용하여 for 문에 적용한다. 그러나 pandas apply를 사용할 때 시간이 오래 걸리지만 tqdm을 사용하기 어렵다. 이 경우 어떻게 할 수 있을까? 이를 지원해주는 것이 바로 tqdm.pandas()이다. import pandas as pd import tqdm.tqdm as tqdm from tqdm import trange tqdm.pandas() with trange(len(x)) as tr: for i in tr: print(x[i]) for i in tqdm(range(10), desc = 'training...'): print(x[i]) dataframe.progress_apply(lambda x: x.split())..

Python 2022.07.06

[Pytorch] torch.Tensor vs torch.tensor

non-data torch.Tensor와 torch.tensor는 같으면서도 다른 역할을 한다. 기본적으로 torch.Tensor는 데이터를 입력하지 않더라도 사용이 가능하지만 torch.tensor의 경우에는 데이터를 무조건 넣어주어야 한다. torch.Tensor() # tensor([]) torch.tensor() # Traceback (most recent call last): # File "", line 1, in # TypeError: tensor() missing 1 required positional arguments: "data" torch.tensor(()) # tensor([]) dimension 추가적으로 가장 중요하다고 생각하는 차이점이 있는데, 아래의 예시를 통해 살펴보자. to..

Python/Pytorch 2022.07.05

[Error] CUDA-LAUNCH_BLOCKING=1 error

pytorch를 다루다 보면 아래와 같은 에러를 마주칠 때가 있다. 이와 같은 CUDA 에러가 나는 원인은 다양하다. 가장 많이 발생하는 오류 중 하나는 loss 값을 계산할 때 값이 0~255 사이 값이 아니라 음수가 나오거나 하는 형태일 때 발생할 수 있다. 0~1사이로 정규화 하게되면 에러가 해결된다. 이 뿐만 아니라 모델의 메모리가 부족한 경우에도 발생할 수 있으니 이때는 Batch size를 조절하거나 자연어처리인 경우 max length를 조절하는 등의 조치를 취해야 한다.

Python/Pytorch 2022.06.25

[Error] module 'scipy.sparse' has no attribute 'coo_array'

networkx를 사용해서 그래프를 그리려고 하면 module 'scipy.sparse' has no attribute 'coo_array' 이 에러를 마주치는 경우가 발생할 수 있다. 해당 에러가 출력되는 원인은 다양한데 첫 번째로는 scipy의 버전이 다르기 때문이다. 1. scipy == 1.8.0 `coo_array`는 scipy==1.8.0 version에만 존재하기 때문에 먼저 version을 맞춰주자. 2. networkx == 2.7.1 networkx의 version도 맞춰주자 3. pyg-nightly PyG를 upgrade해서 변환해보자. pip install pyg-nightly

Python/Pytorch 2022.06.23

[Python] python에서 pickle file 다루기

python에서 데이터를 다룰 때 csv, xlsx과 같은 데이터는 많이 다루어 본 적 있을 것이다. 최근에는 yaml이나 pickle file을 많이 다루게 되는데, 왜 csv와 같은 확장자를 사용하지 않고 pickle을 사용하는 것일까? file을 csv나 xlsx 등과 같은 파일로 저장하는 경우 데이터의 고유한 정보를 담지 못한다. 예를 들어, python에서 list를 csv에 저장하게 되는 경우 다시 호출할 때 list 구조로 받아오는 것이 아니라 str으로 변환된 상태로 불러오게 된다. 그렇다면 ast와 같은 함수를 사용해서 str를 다시 list로 변환하는 작업을 수행해야 한다. pickle은 데이터의 자료 구조를 그대로 저장할 수 있기에 list를 pickle로 저장하면 list구조로 바로..

Python/Algorithm 2022.06.20

[Pytorch] LSTM(Long Short-Term Memory) 코드 구현

Contents LSTM (Long Short-Term Memory)은 RNN (Recurrent Neural Network)가 가지고 있는 장기 의존성 문제(long term dependency)를 해결하기 위해 제안된 모델이다. hidden state $h_t$와 cell state $c_t$로 구성되어 있으며, $h_{t-1}$은 t-1번째 Layer의 hidden state를 의미한다. $h_0$은 초기 hidden state를 의미하며, 0으로 설정한 후 학습을 진행한다. \[ \begin{equation} \begin{split} i_t & = \sigma(W_{ii} x_t + b_{ii} + W_{hi} h_{t-1} + b_{hi} ) \\ f_t & = \sigma ( W_{if} x_..

Python/Pytorch 2022.06.17
반응형