TigerCow.Door


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

오랜만에 텐서플로우에 관련된 포스팅을 진행하게 되었습니다.

최근 기계학습과 관련되서 공부를 하며 텐서플로우를 다루는 방법에 대해서 좀 더 공부해야겠다는 필요성을 느껴서, 아예 처음부터 시작해보려 합니다.

이에 따라서 텐서플로우 공식 홈페이지에 나와있는 tutorial을 하나씩 따라해 가면서 필요한 부분들을 추가적으로 공부해 볼 예정입니다.


https://www.tensorflow.org/tutorials/keras/basic_classification?hl=ko


위의 링크에서 overview 를 살펴보시면 아실 수 있듯이 해당 튜토리얼에서는 tensorflow내부의 keras 를 사용합니다.


먼저 오늘은 첫번째로 basic classification 에 대해서 진행해보도록 하겠습니다.




ㄱ. 데이터 준비하기

In [5]:
# TensorFlow and tf.keras
# 텐서플로우와 keras를 import한다. 이떄 tensorflow는 tf라는 별칭으로 사용할 것임.
import tensorflow as tf
from tensorflow import keras

# Helper libraries
# numpy와 matplotlib을 사용한다.
import numpy as np
import matplotlib.pyplot as plt
# jupyter notebook에서 matplotlib을 사용하기 위한 매직커맨드
%matplotlib inline

print("사용되는 tensorflow의 버전:",tf.__version__)
사용되는 tensorflow의 버전: 1.9.0

이제 Fashion MNIST data를 불러올 것이다.

Fashoin MNIST data는 아래와 같은 이미지들로 구성되어 있다.

하나의 이미지는 28x28 pixels 이다. 이전에는 보통 classic MNIST data로써 숫자 손글씨를 바탕으로 했지만 위와 같은 Fashion MNIST data를 통해 보다 도전적인 문제를 만들어 줄 것이다.

In [6]:
# Fashion MNIST data import
fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
Downloading data from http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 1s 28us/step
Downloading data from http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 21s 1us/step
Downloading data from http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 10s 2us/step

위에서 Fashion MNIST data를 가져왔다.

train_images와 train_labels가 train_data_set이고 test_images와 test_labels가 test_data_set이다.

우리가 만드는 학습모델에 train_data_set을 통해 학습시킬 것이고, test_images를 통해 예측값을 도출한 후 test_labels와 비교하여 오차를 측정할 것이다.

In [9]:
train_labels
Out[9]:
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)

위와 같이 label은 0~9까지의 값을 가지고 있다.

각 숫자가 의미하는 바는 다음과 같다.

Label: Class

0: T-shirt/top

1: Trouser

2: Pullover

3: Dress

4: Coat

5: Sandal

6: Shirt

7: Sneaker

8: Bag

9: Ankle boot

이를 실제로 표현해주기 위해 class_names를 정의한다.

In [10]:
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

ㄴ. 데이터 살펴보기

이제 위에서 가져온 데이터가 실제로 어떻게 생겼는지 살펴보도록 한다.

In [11]:
train_images.shape
Out[11]:
(60000, 28, 28)
In [12]:
test_images.shape
Out[12]:
(10000, 28, 28)

먼저 train와 test image모두 위에서 말한바와 같이 28x28 크기를 가지고 있으며 각각 6만개, 1만개의 이미지를 가지고 있음을 확인할 수 있다.

ㄷ. 데이터 전처리

모델에 데이터를 학습시키기 위해 먼저 데이터 전처리를 진행한다.

In [15]:
# matplotlib을 통해 그림을 그린다.
plt.figure()
# train_images의 첫번째 요소를 그린다.
plt.imshow(train_images[0])
plt.colorbar()
# 점자선을 False로 둠으로써 없앤다.
plt.gca().grid(False)

이미지를 모델에 학습시키기 전에 모든 요소가 0~1의 값을 갖도록 모든 값을 255로 나눠준다.

In [16]:
train_images = train_images / 255.0
test_images = test_images / 255.0

위와 같은 그림을 확인해보면 그림은 그대로 지만 모든 요소가 0~1 사이의 값을 갖도록 변한 것을 확인할 수 있다.

In [18]:
# matplotlib을 통해 그림을 그린다.
plt.figure()
# train_images의 첫번째 요소를 그린다.
plt.imshow(train_images[0])
plt.colorbar()
# 점자선을 False로 둠으로써 없앤다.
plt.gca().grid(False)

보다 많은 이미지를 확인해보자.

위에서 정의했던 class_names를 적용해서 어떤 사진인지 label과 함께 확인해본다.

In [19]:
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid('off')
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])
/Users/doorbw/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/matplotlib/cbook/deprecation.py:107: MatplotlibDeprecationWarning: Passing one of 'on', 'true', 'off', 'false' as a boolean is deprecated; use an actual boolean (True/False) instead.
  warnings.warn(message, mplDeprecation, stacklevel=1)

ㄹ. 모델 구성하기

이제 실제로 Fashion MNIST data를 예측하는 모델을 만들어본다.

neural network의 기본 구성 단위는 layer이다.

먼저 아래의 코드를 확인해보자.

In [20]:
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

위의 코드를 확인해보면 model은 총 3개의 layer를 갖는 것을 확인할 수 있다.

첫번째 layer, Flatten 에서는 28x28로 되어있는 2차원 값을 1차원으로 만들어준다.

두번째 layer, Dense 에서는 128개의 노드를 가지며 relu라는 activation function을 수행한다.

세번째 lyaer, Dense 에서는 10개의 노드를 가지며 softmax함수를 통해 classification하는 작업을 수행한다.

그리고 해당 모델을 실제로 학습시키기 이전에 추가적인 요소들을 아래와 같이 설정한다.

In [21]:
model.compile(optimizer=tf.train.AdamOptimizer(), 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

모델이 사용하는 optimizer를 선택해주고, loss function을 선택한다.

그리고 metrics는 측정항목을 적어준다.

ㅁ. 모델 학습시키기

keras를 통해 모델을 학습시키는 것은 매우 간단하다.

fit 함수를 이용해서 학습시킬 images와 labels를 넣어주고 epoch를 설정한다.

In [22]:
model.fit(train_images, train_labels, epochs=5)
Epoch 1/5
60000/60000 [==============================] - 4s 65us/step - loss: 0.4992 - acc: 0.8261
Epoch 2/5
60000/60000 [==============================] - 3s 43us/step - loss: 0.3746 - acc: 0.8659
Epoch 3/5
60000/60000 [==============================] - 2s 41us/step - loss: 0.3401 - acc: 0.8759
Epoch 4/5
60000/60000 [==============================] - 2s 40us/step - loss: 0.3140 - acc: 0.8863
Epoch 5/5
60000/60000 [==============================] - 3s 44us/step - loss: 0.2951 - acc: 0.8919
Out[22]:
<tensorflow.python.keras.callbacks.History at 0xb4045b358>

ㅂ. 모델 평가하기

모델을 평가하는 것 또한 간단하다.

먼저 전체적인 accuracy를 확인해보자.

아래와 같이 model의 evaluate함수를 이용하여 test images와 labels를 인자로 주면된다.

이때 loss와 accuracy가 결과로 나오게 된다.

In [23]:
test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)
10000/10000 [==============================] - 0s 35us/step 
Test accuracy: 0.8719

개별적으로는, 실제 모델이 어떻게 예측하는지 이미지와 함께 확인해볼 수 있다.

먼저 아래와 같이 model의 predict 함수에 test_images를 인자로 넣어준다.

In [24]:
predictions = model.predict(test_images)

이때 predictions는 리스트 값으로써 test_images의 순서와 동일하게, 각각에 대한 예측값을 갖고있다.

In [25]:
predictions[0]
Out[25]:
array([9.0106724e-08, 3.2413985e-10, 1.7162860e-08, 2.0211715e-09,
       8.9574826e-08, 1.1119398e-03, 2.9414159e-07, 9.4250463e-02,
       5.5220462e-06, 9.0463161e-01], dtype=float32)

우리는 해당 10개의 값중 가장 큰 값을 정답이라고 생각할 것이기 때문에 numpy의 argmax함수를 통해 가장 큰 값을 갖는 인덱스를 뽑아보면 다음과 같다.

In [27]:
np.argmax(predictions[0])
Out[27]:
9

실제로 이는 test_labels의 0번째 값과 동일하다.

In [28]:
test_labels[0]
Out[28]:
9

위와 같은 방식으로 총 25개의 test_images에 대한 이미지와 예측결과를 비교해보자.

In [29]:
plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid('off')
    plt.imshow(test_images[i], cmap=plt.cm.binary)
    # predictions에서 가장 큰 값을 predicted_label 로 가져온다.
    predicted_label = np.argmax(predictions[i])
    true_label = test_labels[i]
    # 이때 실제 test_label과 일치하면 초록색 글씨로,
    if predicted_label == true_label:
      color = 'green'
    # 일치하지 않으면 빨간색 글씨로 출력한다.
    else:
      color = 'red'
    plt.xlabel("{} ({})".format(class_names[predicted_label], 
                                  class_names[true_label]),
                                  color=color)
/Users/doorbw/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/matplotlib/cbook/deprecation.py:107: MatplotlibDeprecationWarning: Passing one of 'on', 'true', 'off', 'false' as a boolean is deprecated; use an actual boolean (True/False) instead.
  warnings.warn(message, mplDeprecation, stacklevel=1)
블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


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

이번 포스팅부터는 aws 서버에 장고 프로젝트를 배포하는 방법에 대해서 알아보도록 하겠습니다.


먼저 진행되는 환경은 다음과 같습니다.


macOS High Sierra

python version: 3.6.5

django version: 2.0


이번 포스팅에서 진행되는 가상환경을 구성하기 위해 필요한 pyenv, virturalenv 등을 제외하고는 윈도우도 거의 비슷한 진행방식으로 가능할 것이라 생각됩니다.


1. pyenv 설치


장고 프로젝트를 배포할때 먼저 로컬에서 가상환경을 구성하고, 그 위에 배포할 장고 프로젝트를 구성해야 합니다.

또한 aws 서버에서 ubuntu를 이용하며 똑같이 가상환경을 이용합니다.

먼저 pyenv 설치하기 전에 아래와 같은 추가적인 패키지들을 설치해줍니다.


1
2
3
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev
cs


위의 내용들은 서버 배포시에 공통적으로 발생하는 문제들을 막기 위해 설치하는 것들이며 pyenv 사이트에도 나오는 내용입니다.

https://github.com/pyenv/pyenv/wiki/Common-build-problems


이제 git clone을 통해 실제로 pyenv를 설치하고 환경변수 설정까지 진행해 보도록 하겠습니다.


1
2
3
4
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
cs


저와 같은 경우에는 zsh를 사용하기 때문에 위의 명령어 중 아래 3줄에 대해서 ~/.bash_profile 대신 ~/.zshrc 를 입력합니다.


1
2
3
$ source ~/.bash_profile
$ pyenv versions
* system (set by /home/nelp/.pyenv/version)
cs


이제 위의 명령어로 터미널창을 재시작해주고 정상적으로 설치되었는지 확인하기 위해 pyenv versions 명령어를 입력합니다. 현재 우리는 pyenv를 통해 추가적으로 설치한 것이 없기 때문에 단순히 system만 나올 것 입니다.


이제 pyenv를 통해 원하는 파이썬 버전을 설치하고 즉각적으로 이용할 수 있습니다.

특정 버전을 설치하는 방법은 아래와 같습니다.


1
$ pyenv install 3.6.5
cs


위와 같이 pyenv install ~ 뒤에 특정 버전을 입력해주면 설치가 되고, 해당 버전을 사용하기 위해서는


1
$ pyenv shell 3.6.5
cs


와 같이 입력하면 됩니다.



2. virtualenv 설치


먼저 pyenv와 같이 git clone을 이용하여 설치합니다.


1
2
3
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
cs


이를 통해 virtualenv가 설치되었으면 이제 우리는 특정 파이썬 버전을 가지는 가상환경을 구성할 수 있습니다.


가상환경을 만드는 방법은,


1
pyenv virtualenv 3.6.5 myenv
cs


와 같이, pyenv virtualenv <원하는 파이썬 버전> <가상환경 이름> 을 입력해주면 됩니다.

이때 파이썬 버전은 pyenv 를 통해 설치되어 있는 버전만 가능합니다.


현재 생성되어 있는 가상환경 목록을 보기 위해서는 다음의 명령어를 입력하면 됩니다.


1
pyenv virtualenvs
cs


또한, 자신이 만든 가상환경으로 진입하기 위해서는,


1
pyenv activate myenv
cs


와 같이, pyenv activate <가상환경 이름> 을 입력하면 됩니다.


가상환경에 진입하면 터미널에서 유저이름 앞에 (myenv) 와 같이 진입되어 있는 가상환경의 이름을 보여줍니다.


만약 가상환경을 나가고 싶다면,


1
pyenv deactivate
cs


를 입력하시면 됩니다.



3. 서버 배포를 위한 장고 환경 구성하기


위에서 pyenv 와 virtualenv의 설치가 정상적으로 되었다면, 실제로 서버 배포를 위해 장고프로젝트의 가상환경을 구성해보도록 하겠습니다.


먼저 파이썬 3.6.5 버전의 django_deploy라는 가상환경을 만듭니다.


1
pyenv virtualenv 3.6.5 django_deploy
cs


그리고 django_deploy라는 이름의 폴더를 새로 만들고 해당 폴더로 들어갑니다.


1
2
mkdir django_deploy
cd django_deploy
cs


그리고 해당 위치에서 다음과 같은 명령어를 입력합니다.


1
pyenv local django_deploy
cs


위의 명령어는 해당 위치에 .python-version 파일을 만들어주면서, 해당 폴더로 가면 바로 django_deploy라는 가상환경에 진입하도록 해주는 명령어 입니다.



이렇게 장고 프로젝트를 위한 기본적인 가상환경 구성은 완료입니다.

이제 해당 가상환경에서 django를 설치하고, pip freeze > requirements.txt 명령어를 통해 패키지목록을 저장해둡니다.

또한 자유롭게 git 설정을 하시면 됩니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc


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

이번 포스팅에서는 github에서 특정 repository에 대해 branch를 생성하고 이를 바탕으로 작업을 시작하는 방법에 대해서 알아보도록 하겠습니다.



1. branch 생성하기


branch 라는 것은 직역하면 나뭇가지로써, 실제로 현재 존재하는 repository에서 뻗어나온 가지와 같은 것으로 생각하시면 됩니다.


개발 영역을 분담해서 작업할 때, 서로 작업하는 내용들에 대해 충돌 등의 예방 및 관리들을 위해서 중앙 repository 또는 개별 branch 자체에서 branch를 생성해, 기존에 있던 내용을 그대로 따와 그것을 바탕으로 개별적인 작업을 할 수 있습니다.


먼저 branch를 생성하는 것부터 진행해보도록 하겠습니다.


현재 github과 연결되어 있는 프로젝트의 폴더로 들어가 아래와 같이 명령어를 입력합니다.


1
$ git branch branch_making_test
cs


해당 명령어를 입력해도 아무 결과가 나오지 않지만,


1
$ git branch
cs


위의 명령어를 한번 더 쳐서 확인해보면 아래 사진과 같이 master와 branch_makig_test 의 두개 항목이 있는 것을 볼 수 있습니다.


git branch 라는 명령어는 현재 branch가 어떠한 것들이 있는지 알려주는 명령어 입니다.

그리고 앞에 있는 * 의 의미는 현재 선택되어 있는(가리키고 있는) branch를 이야기하는 것 입니다. 현재 master branch를 가리키고 있기 때문에 이를 변경해보도록 합니다.

(위와 같은 화면에서 나가기 위해서는 q 한번 또는 두번을 눌러줍니다.)



2. branch 변경하기


branch를 변경하기 위해서는 checkout이라는 명령어를 사용합니다.


1
$ git checkout branch_making_test
cs


위와 같이 입력하면 branch_making_test라는 브런치로 변경되었다는 결과가 뜨고 git branch 명령어를 확인해보면 이전과 달리 branch_making_test의 앞에 *가 쳐져있는 것을 확인할 수 있습니다.


그리고 다음 명령어를 통해 앞으로 push/pull을 할때 새로 만든 브런치를 원격저장소를 사용하도록 지정합니다.


1
$ git push --set-upstream origin branch_making_test
cs



3. branch 삭제하기


현재 우리의 branch는 우리의 로컬 저장소에도 세팅이 되어있고 github이라는 원격저장소에도 세팅이 되어 있습니다.(push를 했다면..)


먼저 로컬 저장소에서 branch를 삭제하는 방법은 간단합니다.

checkout 명령어를 통해 삭제할 branch가 아닌 다른 branch로 이동을 하고 아래의 명령어로 branch를 삭제합니다.


1
$ git branch -d branch_making_test
cs


이렇게 하면 git branch 의 명령어로 확인해보았을때 해당 branch가 정상적으로 삭제된 것을 확인할 수 있습니다.

하지만 github과 같은 원격 저장소에는 아직 branch가 삭제되지 않았습니다.

원격저장소에서도 이를 삭제시키기 위해서는 다음과 같은 명령어를 입력합니다.


1
$ git push origin :branch_making_test
cs


위의 명렁어를 입력하면 해당 branch가 삭제되었다는 결과가 뜨고 실제로 github에서 확인해보았을 때 해당 branch가 삭제된 것을 확인할 수 있습니다.



4. 새로운 branch를 따서 작업하기


위에서 배운 것들을 응용해서, 우리가 github에 올려두었던 프로젝트를 그대로 가져와 새로운 branch에서 작업을 진행해보도록 하겠습니다.


1. 먼저 기존에 올려두었던 github의 프로젝트를 clone 하여 가져옵니다.

1
$ git clone <repository 주소>
cs


2. 이후 명령어창을 통해 git branch를 새로 만듭니다.

1
$ git branch <새로운 branch >
cs


3. checkout 명령어를 통해 branch를 이동합니다.

1
$ git checkout <새로운 branch >
cs


4. 원격 저장소에 해당 branch에 대한 정보를 업데이트 합니다.

1
$ git push --set-upstream origin <새로운 branch >
cs


이후 처음에 clone한 원격저장소로 가서 확인해보면 새로운 branch가 생긴것을 볼 수 있으며 해당 폴더에서 작업을 하시면서, 이전과 같이 커밋과 푸시를 진행하시면 해당 branch에 수정사항이 적용되는 것을 확인할 수 있습니다.

블로그 이미지

Tigercow.Door

Data-Analysis / AI / back-end / Algorithm / DeepLearning / etc