Languages/Python

Languages/Python

[Pytorch] Broadcasting: 차원이 다를 때 연산

Pytorch를 이용하여 모델을 구현하다 보면 텐서 간의 덧셈, 곱셈 등 연산을 수행할 때 차원이 서로 다른 경우를 자주 만나게 된다. 그런데도 에러 없이 연산이 가능한 이유는 바로 Broadcasting 때문이다. Broadcasting은 Numpy에서 도입된 개념으로, PyTorch에서도 동일하게 적용된다. 이 기능 덕분에 복잡한 차원 조작 없이도 깔끔한 수식 구현이 가능하다.Broadcasting이란 서로 shape가 다른 두 tensor 간의 연산에서 작은 텐서의 shape을 자동으로 확장하여 큰 텐서와 연산이 가능하도록 맞춰주는 암시적(implicit) 규칙이다. 이는 개발자가 명시적으로 .expand()나 .repeat()를 호출하지 않아도 자동으로 연산되게 도와주는 기능이다. 아래의 조건이 ..

Languages/Python

[Pytorch] view, reshape, transpose, permute 함수 사용법과 contiguous 특성

Pytorch를 이용하여 코드를 구현할 때 데이터의 차원을 수정하거나 조작할 때 가장 많이 사용되는 함수는 view, reshape, transpose, permute이다. 이 함수들에 대해 제대로 된 사용법과 특징을 정리할 필요가 있다 생각하여 남겨두고자 한다. 또한 contiguous한 특성에 따라 어떤 함수를 사용하여야 하는지도 함께 정리하려 한다. view()메모리를 공유하며 차원 변경연속된(Contiguous) 메모리를 사용할 때만 가능원본 텐서와 메모리를 공유 (즉, view()를 바꿔도 원본도 바뀜) import torchx = torch.arange(6) # [0, 1, 2, 3, 4, 5]y = x.view(2, 3) print(y)# 출력# tensor([[0, 1, 2], # ..

Languages/Python

[Python] 2D 리스트를 1D로 Flatten하게 변환하기

Python으로 데이터들을 재조합하고 파싱 할 때 차원을 변경해야 하는 일이 종종 생긴다. 2차원 리스트를 1차원으로 변경시키는 방법은 대표적으로 itertools라는 라이브러리를 사용하는 방식, list comprehension, 좀 독특한 방법이지만 sum을 이용한 방법이 있다. Itertoolsitertools를 이용한 방법은 두 가지가 있다. *(Asterisk)을 이용한 방법과 from_iterable 메소드를 사용하는 방법이다.우선 *(Asterisk)을 이용한 방법이다. Asterisk는 조금 생소할 수 있지만 Pythonic한 코드를 작성하도록 도와줄 수 있다. Asterisk의 사용은 아래와 같은 상황에서 사용할 수 있다.곱셈 및 거듭제곱 연산으로 사용리스트형 컨테이너 타입의 데이터를 반..

Languages/Python

[Python] Anaconda 이용 중 Pyinstaller를 사용해 패키징 시 exe파일 용량이 커지는 이유

Pyinstaller는 Python으로 실행파일을 생성해 배포하기 위해 사용되는 패키지이다. cx_Freeze나 py2exe 등의 패키지도 있지만 개인적으로 가장 사용이 간편하다고 느껴진다.하지만 고객이 실행파일만 메일로 받고싶어하는 경우도 있고, 실행시 프로그램 부팅 속도를 빠르게 하기위하거나 등 여러가지 이유로 용량이 작은 것이 더 선호된다.이 때 Anaconda를 사용하여 패키지를 import하고 Pyinstaller를 이용해 마지막으로 패키징을 위해 실행파일을 생성하면 예상보다 훨씬 큰 용량이 되는 것을 볼 수 있다. 거기다 onefile을 사용하지 않으면 훨씬 더 큰 용량으로 패키징이 된다. Anaconda를 사용해 패키지를 설치하면 mkl 계열 dll 파일들이 함께 패키징되기 때문이다. MKL..

Languages/Python

[Python] pandas의 Dataframe과 list의 삽입 수행 속도 차이

30만 개 정도의 데이터를 Dataframe을 이용해 append 연산을 하는 작업을 수행하다 비정상적으로 느리게 동작하는 것을 발견했다. 아무리 느린 파이썬이라 해도 이 정도로 삽입 연산이 느린 것은 잘 와닿지 않아 실험을 해보았다. 아래와 같이 7가지 테스트를 진행하였다. pandas append pandas concat pandas loc dict in list dict list comprehension list append list comprehension 1, 2, 3 번은 각각 Dataframe 첫 행 생성 후 append, concat, loc를 이용하여 데이터를 삽입한다. 4번은 dictionary를 list에 append하며 생성하고 Dataframe으로 변환시켰고, 5번은 diction..

Languages/Python

[Python] 파이썬 속도에 영향을 주는 GIL(Global Interpreter Lock)과 Garbage Collection

주요 개념병렬처리GIL(Global Interpreter Lock)Garbage Collection(GC)Thread 파이썬은 일반적으로 컴파일 언어보다 속도가 느리다. 이는 GIL(Global Interpreter Lock) 때문인데 이는 파이썬 객체에 대한 다중 접근을 보호하기 위한 Mutex(Mutual Exclusion, 상호 배제)로서 여러 쓰레드가 동시에 병렬적(Parallel)으로 실행하지 못하도록 하는 것이다. 따라서 한 파이썬 프로세스는 파이썬 인터프리터에 의해 한 쓰레드만이 작업 공간을 점유할 수 있다. 즉 파이썬에서 멀티 쓰레딩을 사용하게 되면 시분할 방식으로 프로세스들이 돌아가며 작업을 수행한다. 병렬 처리, 분산 처리를 통해 속도를 향상시키는 여러 기술이 나왔지만 파이썬은 해당 기..

AlienCoder
'Languages/Python' 카테고리의 글 목록
loading