안녕하세요. 지난 포스팅의 넘파이 알고 쓰자 - Bit packing & output formatting에서는 마지막으로 몇 가지 남은 비트 연산에 대해서 알아보았습니다. 오늘은 넘파이에서도 문자열 연산을 할 수 있다는 것을 보여드리도록 하겠습니다. 다만, 넘파이에서는 문자열을 위한 함수를 굉장히 많이 지원하고 있기 때문에 조금씩 설명을 드리도록 하겠습니다. 오늘 설명드릴 함수들 중 몇 가지는 파이썬에서 기본적으로 제공하는 함수들이 있습니다. 이 함수들과 비교하면서 공부하시면 쉽게 이해하실 수 있습니다. 1. numpy.char.add(x1, x2) 이 함수는 기존 파이썬의 문자열끼리 더하는 + 연산과 완전히 동일한 함수입니다. 아래의 예제를 보면 쉽게 이해하실겁니다. 심지어 인수도 두 개의 문자열만을 ..
안녕하세요. 지난 포스팅의 넘파이 알고 쓰자 - Elementwise bit operations에 이어서 오늘은 다루지 못한 Bit packing과 output formatting에 대해서 다루도록 하겠습니다. 1. numpy.binary_repr(num, width=None) 이 함수는 십진수를 이진수로 변환하여 출력하는 아주 간단한 함수입니다. num에는 변환할 십진수가 들어가고 width에는 몇 비트로 표현할 것인지 적어주면 됩니다. np.binary_repr(3) # '11' np.binary_repr(3, width=3) # '011' np.binary_repr(3, width=4) # '0011' np.binary_repr(3, width=5) # '00011' 이와 같이 width를 바꾸게 ..
안녕하세요. 지난 포스팅의 넘파이 알고 쓰자 - 넘파이 원소 재배열하기에서는 영상 처리에서도 자주 사용되는 flip 함수들과 rot90 함수에 대해서 설명하였습니다. 오늘은 and, or, xor과 같은 논리 연산과 쉬프트 연산인 left_shift와 right_shift에 대해서 알아보도록 하겠습니다. 오늘 역시 아주 간단하기 때문에 쉽게 이해하실 수 있습니다. 1. numpy.bitwise_and(x1, x2) 먼저 논리 연산자 중에서 많이 쓰이는 and 연산과 관련된 함수입니다. 파이썬에서도 이 and 연산은 조건문이나 반복문의 탈출 조건을 명시할 때 사용되는 흔한 함수입니다. 하지만, 이를 비트 단위로 바꿔서 생각해보도록 하겠습니다. 여기서 비트란 정보를 표현하는 최소단위를 의미합니다. 여러분들의..
안녕하세요. 지난 포스팅의 넘파이 알고 쓰자 - 넘파이의 원소 제거 및 추가(delete, add)에서는 넘파이 원소를 제거하거나 추가하는 다양한 방법에 대해서 알아보았습니다. 오늘 포스팅에서는 조금 특별한 routine 함수를 소개해드릴려고 합니다. 이는 영상 처리에서도 굉장히 많이 쓰이는 함수 중에 하나인 flip과 관련된 함수들입니다. 그리고 그와 못지않게 중요한 roll 함수와 rot90 함수에 대해서 소개하도록 하겠습니다. 1. numpy.flip(m, axis=None) 이 함수는 뒤집는(flip) 함수입니다. 말 그대로이죠. 영상 처리에서 뒤집기 연산은 크게 2가지입니다. 수직축을 중심으로 뒤집는 vertical flip, 그리고 수평축을 중심으로 뒤집는 horizontal flip이 있습니..
안녕하세요. 이전 포스팅의 넘파이 알고 쓰자 - 배열 복붙하기(tiling)에서 동일한 배열을 여러번 반복해서 쓰는 tile 함수와 repeat 함수에 대해서 알아보았습니다. 그 결과도 조금씩 달랐죠. 오늘 포스팅에서는 넘파이의 원소를 직접 제거, 추가하는 함수들에 대해서 알아보도록 하겠습니다. 1. np.delete(arr, obj, axis=None) 이 함수는 생각보다 직관적인 함수입니다. 일단 "delete"는 삭제한다는 의미를 가지고 있습니다. 즉, 이 함수는 요소를 삭제하는 함수일 거 같습니다. 그리고 arr은 삭제할 배열, obj는 몇 번째를 삭제할 것인지, axis는 어느 축에서 삭제할 것인지입니다. 간단한 예제를 보도록 하겠습니다. arr = np.array([[1,2,3,4], [5,6..
안녕하세요. 지난 포스팅 넘파이 알고 쓰자 - split 에서는 넘파이 객체를 다양한 방식으로 쪼개는 방법에 대해서 알아보았습니다. 오늘은 1개의 배열이 있을 때 그 배열을 복사하고 붙혀넣는 방법에 대해서 알아보도록 하겠습니다. 일전에 배운 concatenate, stack과 유사한 기능처럼 보이지만 자세히 보면 전혀다른 기능입니다. 1. numpy.tile(A, reps) "A"는 임의의 shape을 가진 배열입니다. "reps"는 조금 이해하기 어렵습니다. 간단하게 설명하게 이 인자는 어떤식으로 A 배열을 복사해서 붙혀넣을 것인지에 대한 인자입니다. 튜플이나 리스트를 넘겨주면 됩니다. 직접 예제를 통해서 보도록 하겠습니다. 먼저, 제일 간단한 1차원 배열부터 보도록 하겠습니다. a = np.array..
지난 포스팅에서 CNN 모델을 이용해서 99%의 분류 성능을 달성하였다. 원하는 목표를 달성하였으니 좀 더 코드를 정리하고 내 나름대로 이쁘게 정리해보도록 하자. 일단 사진과 같이 코드 파일을 신경망을 구성하는 model.py와 학습을 하는 main.py을 나누자. 1. model.py 이 코드에서는 신경망을 정의하는 클래스들을 모아놓았다. 신경망은 지난 포스팅에서 정의한 모델 DNN, CNN 그대로 사용하였다. 먼저, DNN 모델 클래스이다. # DNN 신경망 구성 class DNN(nn.Module) : def __init__(self): super(DNN, self).__init__() # Input shape = (?, 28, 28, 1) -> (?, 28 * 28) = (?, 784) # Den..
이번 포스팅에서는 파이토치를 거의 처음 써보는 제가 MNIST 손글씨 데이터를 분류하는 신경망을 파이토치로 구성하는 과정을 일기 형식으로 한 것입니다. 그 동안 CVPR과 같은 메이져 논문을 읽으면서 느낀 것은 최근에 딥러닝 프레임워크 중 파이토치의 비중이 점점 늘어난 다는 점이다. 그에 반해 나는 딥러닝을 공부해본지 어언 1년 동안 오직 텐서플로우, 케라스만 잡고 있어 현재의 트렌드에 따라가기 많이 어려웠다. 일단 딥러닝을 시작하게 되면 항상 먼저 시작하는 과제 중에 하나가 MNIST 손글씨 데이터 셋이였기 때문에 이번에도 파이토치를 이용해서 진행해보기로 했다. 일단 최종 목표는 99% 달성이다. 그런데 최근 논문들의 코드들을 보면 tqdm과 같은 라이브러리를 추가적으로 사용해서 progress bar..