TigerCow.Door


안녕하세요. 문범우입니다.

이번 포스팅에서는 RNN을 이용하여 hihello를 학습시켜 보도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/




1. 'hihello' 학습시키기

이번에는 위와 같이 우리가 hihello 라는 문자열을 주었을 때, 각 문자에 대해 다음 문자를 예측해보도록 학습시킬 것 입니다.

이 문제가 간단해보일 수 있지만, 좀 더 자세히 살펴보면 h를 입력했을 때, 어쩔때는 i를, 어쩔 때는 e를 반환해야 합니다. 이는 RNN의 특성인, 이전 문자가 무엇이 나왔는지 알아야 값을 제대로 출력할 수 있습니다.



2. RNN basic 정리


그럼 먼저 간단히 RNN의 기본적인 내용에 대해 정리해보도록 하겠습니다.

우리가 그동한 RNN을 공부하면서 그 자체에 대해서는 간단히 여겨질 수 있으나 실제로 RNN에 어떤 값을 어떻게 넣어줘야 할지 복잡할 수 있습니다.

하나씩 살펴보겠습니다.

우리가 넣고자 하는 text는 'hihello'입니다. 그리고 그 문자에는 5개의 유니크한 문자로 존재합니다. 그리고 이 문자열을 인덱스로 표현하면,

h:0 , i:1 , e:2 , l:3 , o:4 이고 이를 one-hot 인코딩으로 나타내면 위 그림과 같습니다.


우리가 전체적으로 구성할 모델은 위와 같을 것입니다.

그럼, 이제 입력 dimension, 출력 dimension, batch size 등에 대해서 생각해보도록 하겠습니다.

그림에서 보듯이 input dimension 은 5입니다.

그리고 총 6개로 구성되기 때문에 sequence = 6 입니다.

또한 hidden 또한 5 입니다.

마지막으로 batch size는 하나의 문자이므로 1 입니다.



3. RNN 만들기


먼저 rnn cell을 만듭니다.

이때 기본적으로 BasicRNNCell 을 이용할 수도 있겠지만, 많이 사용되는 LSTM 이나 GRU를 이용할 수도 있습니다. 이때 중요한 것은 rnn_size입니다.

rnn size는 출력값으로써 5로 정해집니다.


두번째로 중요한 것은 입력입니다.

이는 위에서 알아봤던 것처럼, input dimension = 5, sequence = 6 으로 넣어주면 될 것입니다.


그럼 이를 바탕으로 데이터를 만들어 보도록 하겠습니다.


먼저 입력, x_data 로 hihell을 인덱스로써 넣어주었고 이를 one_hot encoding으로 변환하여, x_one_hot 으로 구성하였습니다.

그리고 우리가 학습하고자 하는 결과값, y_data 또한 위와 같이 구성하였습니다.


그리고 X 와 Y에 우리가 설정한 값들을 넣어줍니다.

위에서 알아본 것과 같이 sequence_length = 6 이며, input_dim = 5 입니다.

이후, cell을 만들고 이때 결과의 크기, hidden_size를 입력합니다.

또한 위에서는 initial_state를 만드는데 전부 0으로 만들었습니다.

그리고 우리가 만든 cell과 state를 이용하여 결과를 내도록 하였습니다.


이렇게 만든 모델이 얼마나 잘 맞는지 알기 위해서 loss를 구해야 합니다.

즉, cost를 구해야하는데 텐서플로우에서는 이를 쉽게할 수 있도록 sequence_loss 라는 함수를 제공합니다.


sequence_loss 함수를 활용하여 위와 같이 구성합니다.

우리의 모델을 통해 나오는 outputs를 sequence_loss의 logits으로 넣어줍니다. 이는 우리의 예측값을 넣어주는 것 입니다.

그리고 targets는 우리의 훈련값을 넣어주는 것으로써 Y를 넣어줍니다. 그리고 여기서 weights는 단순히 1인 값으로 넣어주도록 합니다.


그리고 이것을 평균을 내서 AdamOptimize로 넣어줌으로써 loss를 최소화 시켜줍니다.



그리고 학습과정은 그 동안했던 것과 유사하게 진행해줍니다.



이를 통한 결과는 위와 같습니다.

결과의 초반에 보면 예측이 아주 잘못되고 있지만 시간이 지나면서 loss가 점점떨어지고, 예측또한 잘 되는 것을 볼 수 있습니다.


블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요



안녕하세요.

머신러닝 이론을 학습하면서 동시에 텐서플로우 실습을 진행합니다.

전반적인 이야기는 머신러닝 첫번째 포스트에서 확인하시면 되겠습니다.


먼저 이번 포스팅에서는 텐서플로우의 설치와 간단한 이용에 대해서 설명하도록 하겠습니다.


* 해당 포스트의 모든 내용은 김성훈 교수님의 '모두를 위한 딥러닝'을 바탕으로 제작되었습니다.

관련한 상세 내용은 아래 링크를 참고해주세요.

https://hunkim.github.io/ml/



1. 텐서플로우(TensorFlow)란?


아주 간단하게나마 텐서플로우(TensorFlow)를 알아보면 다음과 같습니다.

Tensor Flow란 data flow graphs를 사용해서 numerical computation을 하는 것입니다.

또한 많은이가 사용하는 python을 기반으로 합니다.


그럼 이때 말하는 data flow graphs란 무엇일까요?

각각의 노드에는 operations으로 표현되고, 각각의 엣지들은 data arrays로 표현됩니다.

그리고 이러한 노드와 엣지들을 통해서 내가 원하는 연산을 하고 결과를 얻을 수 있습니다.



2. 윈도우에서 텐서플로우 설치하기


먼저 이런 텐서플로우설치 방법은 개인의 OS에 따라서 다를 수 있습니다.


윈도우에서 학습중이신 분들은 아래 방법을 따라하시면 되겠습니다.

먼저 텐서플로우를 사용하기 위해 파이썬과 아나콘다가 설치되어야 합니다.

파이썬과 아나콘다는 공식홈페이지에서 쉽게 다운로드 하실수 있기 때문에 생략하도록 하겠습니다



먼저, 아나콘다를 실행시키고 pip를 업그레이드 합니다.


python -m pip install --upgrade pip




그리고 텐서플로우를 사용하기 위한 Conda 가상환경을 만듭니다.


conda create -n tensorflow python=3.5




그리고 만들어진 가상환경을 실행합니다.


activate tensorflow




그러면 프롬프트가 'tensorflow'로 바뀐 것을 확인하실 수 있습니다.

해당 가상환경에 텐서플로우를 설치합니다.


pip install tensorflow




이제 해당 가상환경에서 텐서플로우를 활용합니다.

설치가 정상적으로 이루어졌는지 확인하기 위해 python터미널을 열도록 합니다.


(tensorflow) > python




그리고 아래와 같은 코드를 입력하여 텐서플로우의 구동을 확인합니다.



위의 코드들이 오류없이 작동한다면 텐서플로우가 정상적으로 설치된 것입니다.




3. 텐서플로우 사용해보기


저희가 본격적으로 텐서플로우를 실습하기전에 간단하게 나마 사용을 해보도록 하겠습니다.

먼저 아래 사진을 통해 코드를 확인합니다.



먼저 node1, node2, node3 을 만들었습니다.


node1 = tf.constant(3.0, tf.float32)


에서 먼저 맨 뒤의 tf.float32 는 자료형을 말합니다.

즉, node1 이란 것은 32bit float형으로 만들어진 3.0의 상수값을 말합니다.


node2 또한 동일합니다.


그리고 node3 은 node1과 node2 를 더하는 노드입니다.


그리고 결과를 확인하기 위해


print("result : ", node3)


을 입력하니 오류가 발생합니다. 오류의 원인으로는 node3이 어떤 값이 아니라 노드이기 때문입니다.

즉, node3은 operation으로써 존재합니다.

따라서 올바른 결과를 확인하기 위해


print("result: "m sess.run(node3))


를 입력해야 합니다.


하지만, 이러한 방법은 node1과 node2에 항상 미리 값을 넣어줘야만 합니다.

이와 다른 방법으로는 무엇이 있을까요?

다음의 코드는 a, b 노드에 미리 값을 넣지 않고 나중에 값을 넣으면서 덧셈 값을 출력합니다.



a와 b 노드를 만들때 constant가 아닌 placeholder로 만들면서 데이터의 타입만 설정해 줍니다.

그리고 출력시에 feed_dice= 를 통해서 각각의 노드에 알맞은 값을 넣어주면 됩니다.


지금 코드가 정확히 이해가 가지 않더라도 너무 힘들어 하지 마시고 천천히 따라오시면 됩니다.

아래 그림에서 전체적인 과정을 확인하겠습니다.





우리가 위에서 코드로 간략하게나마 사용해본 텐서플로우는 위의 그림에서 나타내주고 있습니다.


1. 텐서플로우 operations을 사용한 그래프를 만듭니다. 즉 노드와 엣지를 통해서 그래프를 만들어 냅니다.


2. operations을 실행시킵니다. 이때, placeholder에 알맞은 값 또한 함께 입력합니다.


3. 그래프를 통해 업데이트 된 변수의 값을 확인합니다.


생각보다 간단하죠?

노드와 엣지를 통해 그래프를 만들고 그러한 그래프들간의 flow로 구동되는 것을 꼭 기억하세요.



그럼 다음 포스팅에서는 실제로 머신러닝에서 사용되는 Linear regression을 텐서플로우로 만들어보도록 하겠습니다.



블로그 이미지

Tigercow.Door

Back-end / Python / Database / AI / Algorithm / DeepLearning / etc

댓글을 달아 주세요