RNN을 이용하여 Stock Marcket과 같은 time series를 예측하는 방법에 대해 이야기 해보겠다.¶ time series data란 무엇일까? 어떤 시간에 따라 변화하는 값을 의미한다. x축은 시간 y축은 value가 될 것이다. 대표적인 예로 다음과 같은 주식시간의 데이터를 들 수 있겠다. 오픈때 가격, 최대가, 최저가, 판매량, 닫힐때 가격인데, 이것이 매일 기록되니 time series data라 할 수 있다. RNN을 가지고 어떻게 분석할까? 우리가 7일치의 데이터를 가지고 있다고 해보자. 그러면 이 데이터들을 쭉 배열하고 8일째의 가격을 예측해 보는 것이다. 이런 문제를 many to one이라고 한다. 이런 형태의 예측은 7일의 데이터만 가지고 예측하는 것보다 이전의 데이터들을 ..
텐서플로우의 또 다른 기능¶ RNN의 가장 강력한 점은 sequence data를 처리할 수 있다는 것이다. 이전의 예에서 sequence는 크기가 딱 정해져 있었다. 그런데 실전에서 data를 받게 되면 정해져 있지 않을 때가 많다. 예를 들어보자. 번역을 해야하는데 어떤 사람은 20개의 문자열을 어떤사람은 500개의 문자열을 준다. 이렇게 문자열의 개수는 가변하는데, 우리가 편하게 하기 위해서 항상 번역을 할때는 20개의 문자열로 고정시키라고 한다면 사용자들이 굉장히 불편해 할 것이다. 그래서 RNN은 대부분 가변하는 sequence를 입력으로 받아들여야 하는데 어떻게 할 수 있을까? 다음과 같이 hello, hi, why와 같이 다른 값에 다른 길이의 문자열을 준다고 해보자. 어떻게 처리해야 할까?..
Long Sequence RNN 지난번에 긴 문장을 RNN을 이용하여 자동화 했었는데 좋은 결과가 나오지 않았다. 그 이유는 복잡하고 많은 데이터를 다루기에는 RNN 셀이 너무 작았기 때문이다. 그래서 기본적으로 딥러닝의 핵심적인 아이디어는 wide하고 deep하게 가야 한다는 것이다. 우리는 RNN cell이 한 층밖에 없었는데, 이것을 더 쌓는 방법은 없을까? Stacked RNN¶ X = tf.placeholder(tf.int32, [None, seq_length]) Y = tf.placeholder(tf.int32, [None, seq_length]) # One-hot encoding X_one_hot = tf.one_hot(X, num_classes) print(X_one_hot) # check..
전 시간에 hihello라는 데이터를 RNN으로 학습시켰다. 이것을 학습시킬때 숫자로 고치는 과정이라던지 원핫인코딩이라던지 손으로 일일히 했다. 하지만 이게 쉬운 단어가 아니라 책과 같은 많은 양의 문자를 다뤄야 할때는 어떻게 해야 할까? Better data creation¶ sample = "if you want you" idx2char = list(set(sample)) # index -> char , set으로 유니크한 문자열이 나오면 list로 만들어버림 char2idx = {c: i for i, c in enumerate(idx2char)} # char -> idx sample_idx = [char2idx[c] for c in sample] # char to index x_data = [sam..
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..