반응형

Tensorflow serving 하기

TensorFlow Serving을 사용하면 동일한 서버 아키텍처와 API를 유지하면서 새로운 알고리즘과 실험을 쉽게 배포 할 수 있습니다. TensorFlow Serving은 TensorFlow 모델과의 즉각적인 통합을 제공하지만 다른 유형의 모델 및 데이터를 제공하도록 쉽게 확장 할 수 있습니다.(출처: tensorflow.org)

 

참조

Train and serve a TensorFlow model with TensorFlow Serving | TFX

TensorFlow Serving with Docker | TFX

모델 저장

# >> 추후 모델 업데이트를 위해 version별로 모델 저장함
## tensorflow version 2.3.1
model_path='models'
model_name='my_model'
model.save(f'{model_path}/{model_name}/1')

저장된 모델 확인

## model format check
for root, dirs, files in os.walk(os.path.join(model_path, model_name)):
    indent = '    ' * root.count(os.sep)
    print('{}{}/'.format(indent, os.path.basename(root)))
    for filename in files:
        print('{}{}'.format(indent + '    ', filename))

## output format ex)
# 1/
#             .DS_Store
#             saved_model.pb
#             variables/
#                 variables.data-00000-of-00001
#                 variables.index
#             assets/
## ex
$ export model_path='models'
$ export model_name='my_model'

## model input, output shape check
$ saved_model_cli show --dir ${model_path}/${model_name}/1 --tag_set serve \
                       --signature_def serving_default

Serving with Docker

TensorFlow Serving을 시작하는 가장 쉬운 방법 중 하나는 Docker를 사용하는 것 입니다. (출처: tensorflow.org)

Docker 설치하기

(on MacOS)

큐베플로우 설치 on MacOS

(others)

https://www.tensorflow.org/tfx/serving/docker#install_docker

## !!도커 설치가 선행되어야함!! ##

## tensorflow에서 제공하는 이미지 가장 최신버전으로 다운로드(현재 기준 2.3.0)
$ docker pull tensorflow/serving
# image 생성 체크
$ docker image ls
# image 삭제
$ docker image rm <IMAGE ID>
# ex
$ export container_name='serving_base'

## tensorflow/serving container 띄우기
$ docker run -d --name ${container_name} -it --rm \
        -p 8500:8500 \
        -p 8501:8501 \
        -v "$(pwd)/${model_path}/${model_name}:/${model_path}/${model_name}" \
        -e MODEL_NAME=${model_name} \
                tensorflow/serving &

# container 생성 체크
$ docker container ls

# container 삭제
# issue: Bind for x.x.x.x:port# failed: port is already allocated.
$ docker rm -f <NAMES>

docker container ls

모델 실행 (REST API)

rest api port: 8501

import json
import numpy
import requests
data = json.dumps({"signature_name": "serving_default",
                   "instances": x.numpy().tolist()})  # json dumps를 위해 list로 변경 (shape 확인 필수)
headers = {"content-type": "application/json"}
json_response = requests.post(f'http://localhost:8501/v1/{model_path}/{model_name}:predict',
                              data=data, headers=headers)
predictions = numpy.array(json.loads(json_response.text)["predictions"])
print(predictions)
반응형
반응형

안녕하세요.

 

오늘은 이전 포스팅 RNN 이론에 이어 LSTM 이론 및 실습을 하도록 하겠습니다.

 

실습은 "Tensorflow 2.0 beta" 버전으로 RNN을 구축하겠습니다!

 


 

먼저,

 

LSTM(Long Short-term Memory)에 대해 알아보겠습니다.

 

 

Part 1. 이론

 

LSTM은 RNN의 Gradient Vanishing 문제를 해결하기 위해 도입되었습니다.

 

LSTM 구조의 기본 원리는

신경망이 장기적인 관계를 학습을 위하여

중요한 정보를 확실하게 전송할 목적으로 설계되었다는 것입니다.

 

[RNN 과 LSTM 비교]

그림 출처: https://ratsgo.github.io

 

 

1. 유지 게이트(keep/forget gate): 얼마나 많은 양의 이전 메모리를 유지할지 결정

 

이전 시간 단계에서 메모리 상태 텐서는 정보가 풍부하지만,

 

일부 정보는 오래된 것일 수 있다.

 

 

2. 쓰기 게이트(write/input gate): 어떤 정보를 메모리 상태에 기록해야 할 것인지 결정

 

1) 어떤 정보를 쓰려는지 알아 낸다.

 

2) 계산된 텐서가 새로운 상태를 포함하길 원하는지, 이전의 값을 전달하길 원하는지 파악한다.

 

 

3. 출력 게이트(output gate): 시간 단계마다 LSTM 유닛 출력

 

1) tahnh 층은 중간 텐서를 생성한다.

 

2) 시그모이드 층은 현재 입력과 이전 출력을 사용해 비트 텐서 마스크를 생성한다.

 

3) 중간텐서는 최종 출력을 생성하기 위해 비트 텐서와 곱해진다.

 


 

Part2. 실습

 

우선 Tensorflow 2.0 버전을 설치하겠습니다.

 

!pip install -q tensorflow==2.0.0-beta1

!pip install -q tensorflow-gpu==2.0.0-beta1  # gpu 버전

 

 

두 문장이 유산한지(NLP) 예측하는 LSTM 모델을 구현하였습니다.

 

data: 캐글 대회 중 하나인 "Quora Question Pairs"

(단, 데이터 전처리는 다루지 않습니다.)

 

import tensorflow as tf
from sklearn.model_selection import train_test_split # 데이터 셋 분할
import numpy as np
import pandas as pd
import json

train_input, test_input, train_label, test_label = train_test_split(input_data, label_data, test_size=0.2, random_state=2019)

VOCAB_SIZE = input_data.max()+1
WORD_EMBEDDING_DIM = 64
BUFFER_SIZE = 10000
BATCH_SIZE = 16

train_dataset = tf.data.Dataset.from_tensor_slices((train_input, train_label))
test_dataset = tf.data.Dataset.from_tensor_slices((test_input, test_label))

train_dataset = train_dataset.shuffle(BUFFER_SIZE)
train_dataset = train_dataset.batch(BATCH_SIZE)

test_dataset = test_dataset.batch(BATCH_SIZE)

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(VOCAB_SIZE, WORD_EMBEDDING_DIM),    # 자연어 처리 핵심 함수
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64, return_sequences=True)),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32)),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
              
# 모델 훈련
history = model.fit(train_dataset,
                    epochs=10,
#                     validation_data=test_dataset
                   )

 

[결과]

(케글에서 제공하는 test 데이터에 대한 결과는 케글에 제출하면 확인 가능합니다.)

 

[train_accuracy]
[train loss]

 

여기에서는 단층의 얕은 모델을 만들어서 유사도를 측정하였습니다.

 

추가로 더 깊은 모델을 만들어서 성능을 높여 보세요~


LSTM 이론 출처: 딥러닝의 정석

반응형
반응형

 

 

 

 

안녕하세요!

 

오늘은 "파이썬으로 딥러닝 하기!" 중 RNN에 대해 알아보도록 하겠습니다~

 

딥러닝 알고리즘 중 CNN은 전 포스팅에서 다뤘습니다.

 

 

먼저,

 

RNN이란 Recurrent Neural Networks로 순환 신경망이라고 합니다.

 

RNN은 시퀀스 데이터, 예를 들어 음성, NLP, 동영상 등의 데이터에서 사용됩니다.

 


 

[기존 DNN과 RNN 비교]

 

 

RNN이 기존 딥러닝 알고리즘과 가장 다른 점은

 

뉴런의 상태를 저장하고 다음 스텝에서 입력으로 사용함으로

 

긴 시퀀스에 대해서도 예측할 수 있다는 것입니다.

 

 

 

<RNN, 순환 신경망 구조>

 

 

 

이미지 출처: 성킴_RNN_YouTube강의

 

 

모든 뉴런은 이전 층의 모든 뉴런에서 나오는 입력 연결과 이어지는 층으로

 

 모든 뉴런을 유도하는 출력 연결 둘 다를 가지고 있습니다.

 

 

하지만 전방향층과 달리 순환층은 순환 연결이 있으며 동일한 층의 뉴런 간에 정보를 전파합니다.

 

 

따라서 순환 신경망에서 뉴런 활성도는 신경망 인스턴스의 누적 상태를 나타냅니다.

 

 

 

 

<RNN 종류>

 

 

이미지 출처: 성킴_RNN_YouTube강의

 

 

RNN은 위와 같이 입력과 출력의 개수에 따라 다양하게 구성할 수 있습니다.

 

 

many-to-one: 마지막 출력 값이 label 값과 같아지는 것이 목표

 

many-to-many: 입력 데이터를 차례대로 입력하면 차례로 출력 데이터 출력

 

 

 

[RNN의 한계]

 

 

RNN의 Gradient Vanishing(기울기 소실) 문제

 

 

과거 여러 단계 입력들에 대해 계산할 때,

 

경사(Gradient)가 빠르게 줄어들어 (즉, 오차가 더 줄어들지 못하고 수렴하는 문제 발생)

 

장기 의존성을 학습하는 모델의 능력이 심각하게 제한됩니다.

 

 

이 문제를 해결하기 위해 LSTM 구조를 도입했습니다.

 

LSTM은 다음 포스팅에서 다루도록 하겠습니다.

 

 

※ 참고: Back-Propagation Through Time (BPTT)

 

 

RNN은 시간에 따라 펼쳐 놓으면 MLP(Multi-Layer Propagation)와 유사하기 때문에

 

Back-Propagation방법으로 Gradient를 계산할 수 있습니다.

 

 


 

오늘은 여기까지!

 

다음 포스팅으로 돌아오겠습니다~

반응형
반응형

 

 

 

요즘 관심을 가지고 있는 분야인 "NLP(Natural Language Processing), 자연어 처리 분야"에 대해 포스팅을 시작합니다!

 

 

 

우선 오늘은 그 기본 중에 기본인 '토크나이징'에 대해 알아보겠습니다.

 

 

1. 토크나이징(Tokenizing)이란?

 

 

궁극적으로, 텍스트를 자연어 처리를 위한 모델에 적용할 수 있게 '언어적인 특성을 반영해 단어를 수치화'하는 것입니다.

 

 

현재 머신러닝, 딥러닝을 하기 위해서는

 

비정형 데이터인 이미지, 텍스트 등의 데이터는 모두 수치화하여 훈련해야 합니다.

 

 

 

2. 자연어 토크나이징 도구의 종류는 '영어'와 '한글' 토크나이징 라이브러리로 나눠서 알아보겠습니다!

 

 

 

1. 영어 토크나이징 라이브러리

 

- NLTK: 파이썬에서 영어 텍스트 전처리 작업을 하는 데 많이 쓰이는 라이브러리이다.

 

- Spacy: 현재 영어를 포함한 8개 국어에 대한 자연어 전처리 모듈을 제공, 빠른 속도로 전처리할 수 있다.

 

 

 

2. 한글 토크나이징 라이브러리

 

- KoNLPy: 한글 자연어 처리를 쉽고 간결하게 처리할 수 있도록 만들어진 오픈소스 라이브러리이다.

 

* Hannanum: 한나눔. KAIST Semantic Web Research Center 개발.

 

* Kkma: 꼬꼬마. 서울대학교 IDS(Intelligent Data Systems) 연구실 개발. ( 오래 걸림 )

 

* Komoran: 코모란. Shineware에서 개발.

 

* Mecab: 메카브. 일본어용 형태소 분석기를 한국어를 사용할 수 있도록 수정. (Window에서 설치 복잡)

 

* Okt오픈 소스 한국어 분석기. 과거 트위터 형태소 분석기.

 

 

참고: 데이터 사이언스 스쿨(KoNLPy)

 

 

3. 한글의 경우 형태소 토크나이징을 하는 이유는 ?

 

음절: 문자 단위 / 어절: 단어 단위 (쉽게 띄어쓰기 단위) / 형태소: 의미를 가진 가장 작은 단위

 

예) "한글 자연어 처리 공부는 어렵다"

 

음절: 한, 글, 자, 연, 어, 처, 리, 공, 부, 는, 어, 렵, 다

어절: 한글, 자연어, 처리, 공부는, 어렵다

형태소: 한글, 자연어, 처리, 공부, 는, 어렵, 다

 

 

1. 영어와는 달리 한국어에는 조사라는 것이 존재합니다.

따라서 형태소 토큰화를 지향하며, 영어와 달리 어절 토큰화는 한국어 NLP에서 지양되고 있습니다.

 

2. 한국어는 영어권 언어와 비교하여 띄어쓰기가 어렵고, 또 잘 지켜지지 않는 경향이 있습니다.

 

추가) 품사태깅을 하는 이유

: 단어의 의미를 제대로 파악하기 위해서는 해당 단어가 어떤 품사로 쓰였는지 보는 것이 주요 지표가 될 수도 있습니다.

 

 

 

4. Word Embedding에는 크게 두 가지 방식으로 나눌 수 있습니다.

 

: 토큰화한 단어 벡터라이징(Vectorizing, 수치화)하는 방법!

 

 

Frequency based Embedding : CountVectorizer, TF-IDF, bag-of-words

 

Prediction based Vector: Word2vec, CBOW, skip-gram

 

(각각의 방법은 다음 포스팅에서 다루도록 하겠습니다.)

 

 


 

책 '텐서플로와 머신러닝으로 시작하는 자연어처리'를 참고하였습니다.

반응형

+ Recent posts