Python 26

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

함수의 인자를 특정 값으로 고정하기 - functools.partial

일반적으로 쓸 일이 많지는 않지만, 함수를 higher-order function 형태 (lambda, decorator 등 함수 자체를 하나의 객체로 취급하는 경우)로 쓰다 보면, 기존 함수를 재활용하는 경우가 왕왕 있습니다. 한 가지 예는 기존 함수의 특정 인자를 특정값으로 고정시키는 경우죠. 예를 들어, 아래와 같은 코드를 보겠습니다. def print_characters(char, repeat): print(char * repeat) print_characters('*', 10) ********** 별을 10개가 아니라 20개를 출력하고 싶다면? print_characters('*', 20) 그런데 왜인지 무조건 별을 20개 출력하는 함수를 만들고 싶어졌습니다. def print_character..

Python 2020.05.12

대용량 훈련 데이터 처리 - Generator로 TF Dataset 만들기

1. 너무 큰 데이터 tf.data.Dataset는 Tensorflow의 훈련 데이터를 다룰 때 참 편리합니다. Padding, Batch, Shuffle, Map 등을 다 지원해주니까요. 일단 데이터를 Dataset으로 변환만 시키면 그다음부터는 아주 편리하게 사용할 수 있습니다. from_tensor_slices를 쓰면 numpy array를 바로 Dataset으로 변환해주니까 더할나위 없이 편리하고요. 하지만! 이 방법에는 치명적인 문제가 있으니... 바로 변환하려는 전체 데이터가 메모리에 올릴 수 있는 크기여야 한다는 겁니다. 물론 가상 메모리를 써서 메모리를 가짜로 늘릴 수는 있지만 이 순간부터 Thrashing으로 속도가 급격하게 떨어지고, Out-of-memory로 죽기도 합니다. 이 문제가..

Deep Learning 2020.05.07

함수 이름으로 함수 호출하기

함수 이름을 알고 있을 때, 그 이름으로 함수를 호출하고 싶을 때가 있습니다. 예를 들어, 함수의 이름이 tokenize 일 때 이 함수를 어떻게 호출할 수 있을까요? 당연히 아래와 같이 호출합니다. tokenize() 너무나 당연하죠. 그런데 가끔 다르게 호출하고 싶을 수도 있습니다. 이렇게요. f = getattr(sys.modules[__name__], 'tokenize') f() 굳이 왜죠. 왜 이렇게 어렵게. 프로그램 실행 중 동적으로 함수 이름을 알아내고, 이 함수를 호출해야 할 때가 있습니다. 예를 들어 한국어 토큰의 단위는 뭐가 좋을까? 에서 tokenize_by_morpheme_jaso, tokenize_by_morpheme_char, tokenize_by_eojeol_jaso, toke..

Python 2020.05.05

Shell 명령의 결과를 받아오고 싶을 때

파이썬 코딩을 하다 보면 이미 필요한 기능이 리눅스 명령으로 존재할 때가 있습니다. 가끔은 리눅스 명령을 실행해서 결과를 가져오는 것이 편할 때가 있죠. 물론 이 방법은 해당 명령이 해당 시스템에 설치되어야 있어야 하기 때문에 이식성이 조금 떨어집니다. 하지만 적절히 필요한 곳에 쓴다면 개발 속도를 확 높여 줄 수 있습니다. 예를 들어 어떤 텍스트 파일이 몇 줄인지 궁금할 때가 있습니다. 파일을 열고, 줄 별로 읽어서 카운트를 할 수도 있지만, 리눅스의 wc 명령을 간편하게 이용할 수도 있습니다. 속도도 매우 빠르고요. import subprocess result = subprocess.run(['wc', '-l', 'wiki+namu.raw.txt'], stdout=subprocess.PIPE) res..

Python 2020.05.01

간편한 Progress Bar 모듈 - tqdm

큰 데이터를 다루다 보면 지금 프로세싱이 어디까지 처리됐는지 궁금할 때가 있습니다. 텍스트 파일에서 한 줄씩 읽어서 전처리를 할 때도 그렇고요. 데이터를 여기에서 저기로 옮길 때도 그렇고요. 시간이 너무 오래 걸리다 보면 '어딘가에서 무한루프를 돌고 있는 것은 아닐까', '코드를 잘못 짜서 한번 도는데 너무 오래 걸리는 것이 아닐까' 등등 많은 생각이 듭니다. 불안한 마음에 Ctrl+C를 확 눌러버릴까 유혹도 받지요. 자리를 잠시 비우기도 애매하고요. 꼭 자리를 비울 때 에러를 내고 죽으니까요. 가상의 상황을 가정해서 아래처럼 한번에 0.05초가 걸리는 작업을 100번 돌린다고 생각해보겠습니다. 이 경우야 5초면 끝나겠지만 큰 데이터를 다루다 보면 도대체 언제 끝날지 감이 안 올 때가 많습니다. 그리고 ..

Python 2020.04.26