TigerCow.Door


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

이번 포스팅에서는 Fancy Softmax Classification을 구현하겠습니다.

지난 포스팅에서는, 단순히 Softmax Classification을 구현해보았는데, 이번에는 보다 더 이쁘게, 기본적으로 제공되는 croso_entropy, one_hot, reshape을 이용해서 구현해보도록 하겠습니다.


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

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

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



1. softmax_cross_entropy_with_logits



먼저 알아볼 것은 softmax cross entropy with logits 이란 함수입니다.

그 전에 잠깐, 우리가 그전에 hypothesis를 어떻게 계산했는지 한번 더 확인해보겠습니다.

우리는 주어진 X에 대해서 학습할 W를 매트릭스로 곱하고 bias를 더합니다. 그리고 이것을 여기서 logits이라고 부르겠습니다. 그리고 이 logits를 softmax로 통과시키면 우리가 원하는 최종 hypothesis, 즉 확률로써 값을 얻을 수 있습니다.

그리고 이어서 cost를 계산했습니다.


softmax cross entropy with logits를 살펴보자면, 위 그림의 2번식과 같이 우리가 위에서 새롭게 정의한 logits을 이용합니다.

해당 softmax cross entropy with logits 함수는 두개의 인자를 받습니다. logits 과 labels을 받습니다. 각각의 인자에 우리가 설정했던 logits과 labels이름을 적절히 넣어주면 됩니다.


당연히 2번식을 통해 얻은 cost는 위의 1번, 우리가 원래 하던 과정과 동일한 cost입니다.



2. Animal classification


이번에는 우리가 배웠던 것을 이용해서 동물들을 분류해보는 실습을 진행해보도록 하겠습니다.

동물을 다리의 숫자, 뿔의 유무 등의 특징을 이용해서 0~6, 총 7종류로 분류해보겠습니다.


위 그림의 표는 잘 보이지 않지만, 제일 우측에는 예측되는 결과 값이고, 나머지의 값은 x_data 입니다.

따라서, 그림에 나와 있는 코드처럼 x와 y데이터를 알맞게 불러와 줍니다.


여기서 Y데이터의 모양에 대해서 한번 더 살펴보겠습니다.

y는 n개의 데이터에 대해 1줄로써 표현되기에 ( ? , 1 )과 같은 shape을 가집니다.



그리고 해당 Y값을 one_hot 함수를 통과시킵니다.

그런데 이때 주의해야 할점은, 위 코드에서 3번째 줄처럼 one_hot을 통과시키면 shape이 하나 증가하게 됩니다.

예를 들어 y의 값이 [[0],[3]] 이 었다면 3번째 줄의 one_hot 함수를 통해,

[[[1000000]],[0001000]] 이 될 것입니다.

이럴떄 우리가 사용하는 함수는 reshape 입니다. 


이후에는 우리가 그동안 했던 것처럼, placeholder 등을 적절히 설정하여 코드를 작성합니다.

전체적인 코드는 아래와 같습니다.



그리고 결과를 보면 아래와 같은 결과를 확인할 수 있습니다.

Step이 늘면서 Loss가 매우 적어지고, 이후 100%의 예측률을 보이게 됩니다.



이렇게 하여 TensorFlow로 Fancy Softmax Classification을 구현해보았습니다.

one_hot과 관련되어 reshape 함수도 사용해보았고, logits이라는 것을 사용하기도 하였습니다.

내용에 대한 피드백이나 궁금한 사항은 댓글 또는 이메일로 남겨주세요.

블로그 이미지

Tigercow.Door

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

댓글을 달아 주세요


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

이번 포스팅에서는 Tensorflow를 통한 Softmax Classification 구현을 진행해보도록 하겠습니다.


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

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

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



1. Softmax Classification


우리가 이론부분에서 알아보았던 거처럼, Softmax는 어떤 n개의 예측하고자 하는 것이 있을때 Softmax를 사용합니다.




물론 이러한 Softmax도 위의 그림에서 볼 수 있듯이, 주어진 X값에 학습할 W를 곱해서 값을 만드는 것으로 시작합니다.

그리고 그러한 식의 결과로 나오는 것은 단순히 Score로써 실수값을 갖게되는데 이들을 Softmax function을 통과시킴으로써 확률로써 다룰 수 있게 됩니다.



2. Tensorflow로 구현하기


이를 Tensorflow로 구현하는 것은 매우 간단합니다.

기본적으로 위의 수식을 그대로 적어주면 되는데, 실제 코드와 함께 그림을 보면 다음과 같습니다.


그리고 위의 코드에서 hypothesis가 결국 우리가 원하는 것이고 그것은 이론에서 알아보았던 것 같이 확률로써 값이 나올 것입니다.


이렇게 우리가 Softmax 코드를 알아보았는데, 이에 걸맞는 Cost Function도 알아봐야겠죠?

코드는 아래와 같습니다.



이는 우리가 이론시간에 알아본 것과 같이 Y * log(hypothesis)에 대한 평균값을 내는 것입니다.

그리고 이러한 cost 값을 미분한 값에 learning rate를 곱해서 cost를 최소화하는 optimizer함수까지 구현할 수 있습니다.


위의 내용을 전체적인 코드로 살펴보면 아래와 같습니다.




위의 코드에서 y_data를 살펴보면 one-hot encoding으로 되어있는 것을 볼 수 있습니다.

one-hot encoding은 하나의 값만 1로써 한다는 방법입니다.


그리고 x와 y 데이터에 대한 placeholder에서 shape도 살펴보면, x는 4, y는 3의 shape을 가집니다.


이러한 코드를 통해서 실제로 데이터에 대한 테스트를 진행해볼 때, 그 결과를 보다 쉽게 확인하는 방법도 있습니다.



위의 Test내용을 보시면 우리가 설정했던 hypothesis를 이용함을 알 수 있고, 총 3개의 array가 test data로 사용되었습니다.

이때 각각에 대한 예측 결과값이 초록색으로 써져있는 값인데 이때, print 문에 써져있는 arg_max함수를 이용하면, 어떠한 값이 제일 맞는 값인지, 그 값에 대한 index를 반환합니다. 즉, 맨 아래의 [1 0 2] 값이 반환되는 것입니다.



이렇게 해서 Tensorflow에서 Softmax를 직접구현해보았습니다.

다음 포스팅에서는 조금 다른, Fancy Softmax에 대해서 구현을 해보도록 하겠습니다.

블로그 이미지

Tigercow.Door

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

댓글을 달아 주세요

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

오늘은 TensorFlow에서 데이터 파일을 읽어와 multi-variable linear regression을 구현해보도록 하겠습니다.


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

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

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



1. Loading Data From File


데이터가 많아지면 이러한 데이터를 직접 입력하는게 힘들어 집니다.

이럴 경우 우리는 데이터들을 텍스트 파일로, 주로 csv파일로 저장하고 이를 불러오는 방법을 사용합니다.

지난 번 실습에서 진행된 데이터들을 바탕으로 아래와 같은 내용을 메모장을 통해 작성하여 바탕화면에 data-01-test-score.csv 라는 이름으로 저장하였습니다.



이제 이러한 파일을 numpy 모듈을 통해 배열로 읽어올 것 입니다.

그리고 우리가 해줘야 할 것은 어떤 데이터가 x 데이터이고, 어떤 데이터가 y 데이터인지 나누는 것입니다.

이제 여기서 파이썬에서 사용되는 리스트의 슬라이싱을 통해 x와 y의 데이터를 나눕니다.



위 사진은 Slicing에 대한 간략한 내용을 보여주고 있으며, 보다 자세한 것은 아래 포스팅을 참고하시면 좋을 것 같습니다.


파이썬(python) #6_ 리스트 자료형 : http://doorbw.tistory.com/77?category=677823


또한 우리는 numpy를 통해 아래 사진과 같이 보다 강력한 슬라이싱 기술을 사용할 수 있습니다.



b[1, 1] 에서 앞의 1은 첫번째 row를 말합니다. 그리고 뒤의 1을 통해 첫번째 인자를 가져오게 됩니다.

그렇다면 실제로 우리가 좀 전에 작성한 데이터 파일을 어떻게 가져올지 알아보겠습니다.


우리는 데이터 파일에 있는 숫자들 중 앞의 3개는 x 데이터, 맨 마지막 숫자는 y 데이터로 가져올 것입니다.

따라서 아래와 같은 코드를 통해 슬라이싱을 진행하면 됩니다.


import numpy as np

xy = np.loadtxt('C:\\Users\B.W.Moon\Desktop\data-01-test-score.csv',delimiter=',', dtype=np.float32)

x_data = xy[:, 0:-1]

y_data = xy[:,[-1]]


이때 파일의 경로를 올바르게 적어줘야 하며 특정 디텍토리의 이름이 U로 시작한다면 \ 하나가 아닌 \\ 두개를 사용하셔야 합니다.

슬라이싱이 제대로 되었다면 그 전 실습들에서 했던 것과 같이 tensorflow에 알맞은 코드를 작성합니다.



위의 코드는 지난번 실습에서 사용했던 코드들과 매우 유사하니 설명은 따로 생략하도록 하겠습니다.


헌데 만약 데이터의 크기가 너무 커서, 메모리가 감당하지 못할땐 어떻게 할까요?

이때, 텐서플로우에서 지원해주는 Queue Runners 를 이용하여 해결할 수 있습니다.



위의 사진과 같은 구조를 가진 Queue Runners는 특정 데이터를 불러와서 적당한 처리를 통해 우리가 필요한 데이터만 그때그때 메모리에 올려서 사용하는 구조입니다.

이를 사용하는 방법은 크게 3가지 순서로 나눌 수 있습니다.



처음에는 우리가 불러올 여러개의 데이터파일을 모두 적어줌으로써 queue에 올립니다.

그리고 파일을 읽은 reader를 설정해줍니다.

이후 우리가 불러오는 값(value)를 어떻게 parsing 할 것인가를 설정합니다.


그리고 텐서플로우에서 지원해주는 batch를 이용합니다.

batch 일종의 펌프같은 역할을 하여 데이터를 읽어올 수 있도록 해주는 것입니다.



위의 코드와 같이 batch를 이용하여 데이터를 어떻게 읽어올 것인지 슬라이싱 하여 설정합니다.

또한 batch_size 를 통해 한번에 몇개를 가져올 것인지 함께 설정합니다.

그 이후는 그 동안의 코드와 동일합니다.

단지, loop를 돌때 위에서 설정한 batch를 통해 session을 실행시킵니다.


전체적인 코드는 아래와 같습니다.



물론 결과는 이전과 동일 합니다.

추가적으로 여러분께서 batch를 섞어서 사용하고 싶으시다면 shuffle_batch 라는 기능도 있으니 참고하시면 좋을 것 같습니다.





블로그 이미지

Tigercow.Door

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

댓글을 달아 주세요

  • ㅁㄴㅇㅁㄴㅇ 2020.07.02 14:28  댓글주소  수정/삭제  댓글쓰기

    출처는 안 밝히시나요

    • Favicon of https://doorbw.tistory.com BlogIcon Tigercow.Door 2020.07.02 14:42 신고  댓글주소  수정/삭제

      안녕하세요. 문범우입니다.
      우선, 출처와 관련되어 정확하게 안내드리지 못하여 불편을 드렸다면 죄송합니다.
      관련된 포스트들 중 첫번째 포스트에서 내용에 대한 출처를 안내드렸습니다. (https://doorbw.tistory.com/88)
      추가적으로 게시한 관련 포스팅에 대해 금일 중 출처를 추가하여 혼동이 없도록 조치하겠습니다.
      불편을 드렸다면 다시한번 죄송합니다.