분류 전체보기 54

pyc 파일에 대해서

1. *.pyc 파일 Python으로 코딩을 하다 보면 내가 만들지 않은 *.pyc 파일들이 만들어져 있는 것을 볼 수 있습니다. 가끔은 *.pyc가 문제를 일으키기도 하고요 (bad magic number in 'application': b'\x03\xf3\r\n': ImportError) *.pyc는 Python이 *.py를 읽어서 실행시킬 때 자동 생성되는 파일인데, 이는 Python 프로그램이 어떻게 구동되는지와 관련이 있습니다. (이야기를 진행하기에 앞서 한가지 명확히 해야 할 것이 있습니다. 우리가 보통 Python이라고 이야기하지만, Python이라는 것은 프로그래밍 언어이기 때문에 앞으로 이야기할 내용은 엄밀히는 CPython에 대한 이야기입니다. CPython은 Python이라는 언어를 ..

Python 2020.06.03

Tensorflow Custom Training

Tensorflow를 사용하는 가장 큰 이유는 아마도 편리하게 Deep Learning 모델을 만들고 훈련시킬 수 있다는 점일 것입니다. 특히 2.0부터 Keras가 공식적으로 포함되면서 모델을 만들기가 더 쉬워졌습니다. 물론 그 전에도 Keras를 따로 사용하면 되기는 했지만요. Keras가 대부분의 인기 있는 아키텍처와 유틸리티를 지원하기 때문에 많은 부분을 직접 구현하지 않고, Keras의 구현을 가져다 쓸 수 있죠. 하지만 가끔은 Keras에서 아직 지원하지 않는 모델을 사용하고 싶을 때가 있고, 훈련 과정을 좀 더 세밀하게 제어하고 싶을 때가 있습니다. 이때 Tensorflow의 Custom Training 기능을 사용할 수 있습니다. 오늘은 Keras 패키지 밖의 Tensorflow 기능들도 ..

Deep Learning 2020.06.02

Docker Image에서 개발 중인 코드를 사용하기

전에 Docker를 이용해서 비교적 간편하게 Tensorflow GPU를 사용하는 법을 공유드렸습니다 (Docker를 이용해서 편리하게 GPU Tensorflow를 사용하자). Docker를 이용하면 Performance에 영향은 거의 없으면서, 환경을 독립적으로 유지할 수 있다는 장점이 있습니다. 이런 점은 배포 시에는 아주 좋지만 개발 시에는 치명적인 문제점이 있는데, 바로 코드를 변경할 때마다 Docker Image를 새로 빌드해야 한다는 점입니다. 간단한 방법을 통해서 이 문제를 해결할 수 있습니다. Docker를 이용해서 편리하게 GPU Tensorflow를 사용하자를 따라서 설정을 했다고 가정하겠습니다. 그럼 아래 명령으로 Docker의 Bash shell으로 진입할 수 있습니다. $ dock..

Deep Learning 2020.06.02

-m 실행 옵션과 __name__

Python 관련 글들을 보다 보면 스크립트를 실행시킬 때 어떤 때는 python3 script.py처럼 실행시키고, 어떤 때는 python3 -m script처럼 -m 옵션을 사용해서 실행시킬 때가 있습니다. 차이는 무엇일까요? 전자는 script.py를 실행시키는 것이고, 후자는 script라는 이름의 모듈을 sys.path에서 찾아서 실행시키는 것입니다. sys.path에 대한 설명은 알쏭달쏭 Python import - sys.path을 참고하세요. 오늘도 간략한 예시를 들어서 알아보겠습니다. 1. 간단한 함수부터 아래와 같은 Python 코드를 만들고 있다고 가정해보겠습니다. 주어진 문자열 주위를 아름답고 화려한 *으로 감싸주는 코드입니다. import sys def print_with_bord..

Python 2020.05.28

디렉터리 구조를 확인하고 싶을 때 - tree

현재 작업 중인 프로젝트의 디렉터리 구조를 알고 싶을 때가 있습니다. 물론 작업 중이던 프로젝트라면 머릿속에 대부분이 들어있겠지만, 문서화를 한다거나, 프로젝트를 맡은 지 얼마 안 됐다거나 하는 경우에는 필요한 경우가 있습니다. tree 라는 명령을 사용할 건데요. 혹시 설치가 되어있지 않다면 설치해줍니다. Ubuntu를 사용하신다면, sudo apt install tree Mac OS X를 사용하신다면, brew install tre 과 같이 설치해줍니다. 사용법은 아주 간단합니다. ➜ tree django_demo django_demo |-- django_demo | |-- __init__.py | |-- __pycache__ | | |-- __init__.cpython-37.pyc | | `-- s..

Linux 2020.05.23

Pre-trained Word Vector를 Tensorflow에서 사용하기

Tensorflow에서 제공하는 Embedding Layer는 간편하게 사용하기에 좋습니다. 하지만 아무래도 대량의 데이터를 사용해서 별도로 훈련시킨 Word Embedding을 사용하는 것보다는 성능이 떨어집니다. (Tensorflow의 Embedding Layer vs fastText) fastText 같은 Library는 Python 인터페이스를 제공하기 때문에 pre-trained word vector를 Tensorflow에서 사용하기 쉬운 편입니다 (한국어 토큰의 단위는 뭐가 좋을까?). 하지만 이런 인터페이스가 없이 순수하게 단어와 그 단어의 Embedding 데이터만 있다면 어떻게 할까요? 결론부터 말하면 Keras Embedding Layer의 weights를 수동으로 지정해주고, trai..

Deep Learning 2020.05.20

venv는 내부적으로 어떻게 작동할까?

Python의 모듈 간 의존성 문제를 해결하기 위해서 virtualenv나 venv를 많이 사용하실 겁니다. 시스템에 설치된 모듈들과 virtual environment 내에 설치된 모듈들을 분리해주기 때문에 모듈들이 꼬일 걱정 없이 사용할 수 있어서 참 좋습니다. 개인적으로 저는 새 Python 프로젝트를 시작하면 venv와 git 초기화를 꼭 실행합니다. 그런데 가끔 내부적으로 어떻게 이 기능이 작동하는지 궁금할 때가 있습니다. 그래서 오늘은 venv가 어떻게 작동하는지 한번 알아보겠습니다. (virtualenv도 작동 방식은 거의 동일합니다.) 1. venv를 만들자 먼저 아래 명령으로 virtual environment를 만듭니다. python3 -m venv env 그럼 현재 디렉터리에 env ..

Python 2020.05.19

bad magic number in 'application': b'\x03\xf3\r\n': ImportError

자주 겪는 문제는 아니지만 종종 python에서 bad magic number in 'application': b'\x03\xf3\r\n': ImportError가 날 때가 있습니다. 이 에러는 python 2.x 대 버전으로 만들어진 *.pyc 파일을 python 3.x 대 버전으로 실행시키려고 할 때 발생합니다. "python main.py" 명령으로 main.py를 실행시킴. main.py는 다른 모듈들을 import 함. python 명령은 python 2.x 버전이고, 이 과정에에서 python 2.x 대에 맞는 *.pyc 파일들이 생성됨 python 2.x가 아닌 python 3.x를 써야했다는 생각이 떠올라서 "python3 main.py" 명령으로 다시 main.py를 실행시킴 bad ma..

Python 2020.05.19

알쏭달쏭 Python import - sys.path

Python으로 만들고 있는 프로그램이 커지기 시작하면 모듈화를 합니다. 이 기능, 저 기능을 모아서 하나의 파일로 합쳐서 모듈(*.py)로 만들지요. 모든 모듈들이 한 디렉터리에 있을 때는 아무 문제없이 행복합니다. 그러다가 조금 더 프로그램이 커지면 모듈들을 모아서 패키지(디렉터리)로 만들고 슬슬 문제가 시작됩니다. 멀쩡히 import 되던 모듈들이 찾을 수 없다며 import가 되지 않거나 , 엉뚱하게 동작하는 일들이 생기죠. 이것이 다 python의 sys.path 때문입니다. 1. sys.path 누구냐 넌 sys.path는 모듈을 import 할 때 모듈을 찾아야할 경로들을 저장해둔 list입니다. 예를 들어 sys.path가 ['directory_A', 'directory_B', 'direc..

Python 2020.05.15

CategoricalCrossentropy vs SparseCategoricalCrossentropy

Tensorflow는 classification task에서 간편하게 사용할 수 있는 cross entropy loss 함수를 제공하고 있습니다. Binary classification이라면 BinaryCrossentropy를 사용하면 되고, Multi-class classification이면 CategoricalCrossentropy를 사용하면 됩니다. 그런데 API를 보면 비슷하게 생긴 SparseCategoricalCrossentropy라는 녀석도 있습니다. 차이가 뭘까요? 결론부터 말씀드리면, 훈련 데이터의 label(target)이 one-hot vector 이면 CategoricalCrossentropy 훈련 데이터의 label(target)이 정수이면 SparseCategoricalCross..

Deep Learning 2020.05.14