RNN-Hi Hello¶ RNN에게 hi hello라는 단어를 훈련시켜 보겠다. 한 문자를 주면 그 다음 문자를 예측하도록 할 수 있도록 학습 시켜보겠다. 간단해 보이지만 어떤 h를 훈련시켰을 때는 i가 나와야 하고 같은 h 이지만 어떤 h는 e가 나온다는 사실이다. 그래서 일반적인 forward net으로는 쉽지 않다. 이전의 문자를 알아야 값을 잘 출력 하도록 해주는 RNN이 효과적이다. rnn 자체가 어려운건 아닌데 rnn에 넣을 문자들을 가공하는 것이 복잡하게 느껴질 수 있다. 텍스트를 유니크한 문자만 구하고, 각 문자들에 숫자를 매긴다. 이렇게 문자를 숫자와 대응시키고 나면 원핫인코딩을 이용해 표현할 수 있다. 입력의 디멘션은 5이다. sequence 길이는 6이다. 출력(hidden)의 디멘션..
RNN in TensorFlow¶ 1단계¶ rnn을 구현 할 때에는 2가지를 고려해야 한다. 이번 출력이 다음번 cell로 연결되기 때문에 어떤 형태의 cell을 만들 것인가 고민해야 한다. 대표적인 것들로 rnn, lstm, gru 같은 것들이 있다. 그리고 cell을 만들때 가장 중요한 점은 cell에서 나가는 아웃풋(출력,ht)의 크기가 얼마일지 결정해 주는 것이다. 두번째로는 셀을 만든 것을 실제로 구동시켜서 입력을 주고 출력값을 뽑아내야 하는데 드라이버 or 또는 다른 형태의 함수(레퍼)라고 볼수도 있는데 보통 tf.nn.dynamic_rnn을 사용한다. 우리가 만든 셀과 입력 데이터를 넣어주면 output 출력과 states 출력 값을 준다. 이렇게 나눈 이유는 셀을 생성하는 부분과 구동시켜주..
우리가 사용하는 데이터들 중에서는 Sequence data가 상당히 많이 있다. 예를 들어, 음성인식, 자연어를 보면 1개의 데이터가 아니라 sequence 형태로 되어있다. 1개의 단어만 이해한다고 해서 전체 맥락을 이해하는게 아니라 이전에 했던 말들, 단어들을 이해해야지만 이해할 수 있다. 기존에 있던 NN/CNN은 x라는 입력이 있다면 y라는 출력이 나오는 간단한 형태였기 때문에 x0, x1, x2... 이런 시리즈 데이터들을 처리하기가 불편했다. 그래서 많은 사람들이 고민한 끝에 만들어 낸 것이 다음과 같은 형태의 네트워크이다. 시리즈 데이터를 이야기 할 땐, 이전의 어떤 데이터가 그 다음에 영향을 줄 수 있어야 한다. 그런 것들을 해보자는 뜻에서 만든 것이 어떤 현재의 state가 다음 stat..
지난번에 Deep CNN을 이용하여 99.3%의 정확도가 나왔다. 그런데 소스코드가 너무 복잡하고 관리하기가 힘들기 때문에 파이썬의 class를 이용하면 효과적으로 관리할 수 있다. In [2]: import tensorflow as tf import numpy as np # import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data tf.set_random_seed(777) # reproducibility mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # Check out https://www.tensorflow.org/get_star..
Simple CNN을 이용하여 MNIST를 분류해보겠다. MNIST and Convolutional Neural Network¶ In [1]: import tensorflow as tf import random # Import matplotlib.pyplot as plt from tensorflow.examples.tutorials.mnist import input_data tf.set_random_seed(777) # reproducibility In [2]: mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # Check out https://www.tensorflow.org/get_started/mnist/beginners for # m..
ConvNet은 이미지와 텍스트 분류 외에도 여러가지 분야에서 좋은 성능을 발휘한다. 이것의 과정을 크게 3가지로 나눠볼 수 있다. 1. convolution이라는 과정을 통해 filtering 하여 여러가지 convolution layer로 값을 뽑아내는 방법 2. 대이터량이 너무 많아지니 작게 subsampling을 한다. 3. 나눠진 값들(특징들이 추출된 값들)을 최종적으로 일반적인 (forward NN, FC)를 통해서 분류나 회귀를 한다. CNN이 특히 이미지에 대해서 잘 동작을 하는데, 한국 아산대학교 컨테스트에서 CNN을 이용해 CT images 결과를 내어 수상하기도 했었다. 전에 블로그에 올렸었던 풀링 과정이다. convolution하는 과정과 sampling하는 과정이 Tensorflo..
설명했던 가장 기본적인 형태의 ConvNet ImageNet 경연대회에서 1등을 했던 ConvNet ... 이 과정에서는 nomalize 하고 있지만 요즘에는 잘 사용하지 않는다. 디테일 한 사항은 다음과 같다. 2014년도 우승자 2015년도 우승자 그림을 구별하는 사람의 판단력을 능가. 많은 대회를 휩쓸었다. 알아둘 것. ResNet같은 경우에는 layer가 엄청나게 늘어났다. 이렇게 증가하면 학습하기가 매우 어려울 것 같다. 뛰어넘는듯한 개념때문에 뛰어넘는 부분의 layer를 한 묶음으로 볼수도 있기 때문이지 않을까 하고 유추도 해본다. 2014년도 우승 알고리즘과와 2015년도 우승 알고리즘의 아이디어가 유사하다는 것을 알 수 있다. 이미지 뿐만 아니라 ConvNet으로는 여러가지를 할 수 있다...
다음 그림을 보자. (여기서 CONV, RELU, POOL의 횟수나 순서는 직접 정하는 것이다.) Pooling layer Pooling layer는 sampling을 하는 기능을 담당한다고 보면 된다. 앞에 이미지가 있고 필터링 하여 conv layer을 만들었는데 깊이는 필터의 개수에 따라 달라진다고 하였다. 그때 하나의 conv layer에서 하나의 layer만 뽑아내보자. 이것을 뽑아서 size를 작게 하는것을 pooling이라고 한다. 그렇게 하나의 layer씩 pooling 한 다음 쌓는다. Pooling은 어떻게 하는지 예를 들어보자. 다음 4x4 matrix에서 stride의 크기를 2로 2x2 필터링을 한 다음 가장 큰 값을 output으로 정해준다. 하나의 값들만 뽑았기 때문에 samp..