티스토리 뷰
모델구조 이해하기
텐서플로 2.0 버전에서 케라스를 이용해 모델을 구현하는 방법을 알아보자. 전반적인 자연어처리에 대해 알려면 아래의 블로그를 참고하자'
구현 순서
전처리 => 모델만들기 => 학습하기
1.단계 전처리하기
컴퓨터는 한국어를 이해할 수 없습니다. 그래서 Deep learning을 하기 위해 한국어를 컴퓨터가 이해할 수 있게 Vector로 변환하는 과정이 필요합니다. 이를 우리는 전처리라고 하고, 입력값을 임베딩된 벡터로 변형한다라고도 합니다.
활용할 구조 : 심층 신경망(Deep Neural Network) 구조
구현할 모델 : 긍정/부정을 예측하는 감정 분석(Sentiment Analysis)
시작해 볼까요?
다음의 전처리 코드를 한 줄씩 이해해 봅시다.(궁금한 줄을 선택해 주세요)
import tensorflow as tf
from tensorflow.keras import preprocessing
samples = ['날이 좋아, 기분이 너무 좋다',
'오늘 기분이 별로야',
'프로젝트 너무 힘들어',
'문장 분류를 배워서 행복해',
'한파이는 너무 즐거워']
labels = [[1], [0], [0], [1], [1]]
tokenizer = preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(samples)
sequences = tokenizer.texts_to_sequences(samples)
word_index = tokenizer.word_index
import tensorflow as tf
tensorflow 모듈을 가져와서 tf로 사용할 수 있게 만들어 줍니다.
from tensorflow.keras import preprocessing
아래의 text module을 사용하기 위해 tensorflow.keras 에서 preprocessing utils를 가져옵니다.
samples = ['날이 좋아, 기분이 너무 좋다',
'오늘 기분이 별로야',
'프로젝트 너무 힘들어',
'문장 분류를 배워서 행복해',
'한파이는 너무 즐거워']
전처리할 문장들입니다다.
labels = [[1], [0], [0], [1], [1]]
우리는 지금 긍정과 부정으로 두 가지 나눠서 분류를 하고 있기 때문에, samples 값에 맞게 긍정은 [1], 부정은 [0]으로 만들어 준 것이다. 이러한 두 가지 분류를 영어로 binary classification이라고도 합니다.
tokenizer = preprocessing.text.Tokenizer()
tf.keras.preprocessing.text 모듈은 Tokenizer 클래스를 포함합니다. Tokenizer 클래스를 사용하여 tokenizer 인스턴스를 만들어 줍니다.
tokenizer.fit_on_texts(samples)
tokenizer 인스턴스에 fit_on_texts를 사용하여 텍스트로 이루어진 리스트를 토대로 내부 단어를 업데이트 합니다. 아래의 texts_to_sequences나 texts_to_matrix를 사용하기 전에 fit_on_texts를 적용해 줘야합니다.
sequences = tokenizer.texts_to_sequences(samples)
texts_to_sequences는 samples에 들어간 text를 integers로 이루어진 숫자의 시퀀스 형태로 바꿔준다.
word_index = tokenizer.word_index
word_index의 속성은 단어와 숫자가 딕셔너리의 key와 value 쌍으로 바꿔줍니다.
자연어 토크나이저 알아보기.
https://codetorial.net/tensorflow/natural_language_processing_in_tensorflow_01.html
공식문서 관련 구현
https://www.tensorflow.org/tutorials/keras/text_classification?hl=ko
2.단계 모델 구현하기
심층 신경망 모델을 만드는 방법에는 Sequential API 방법과 Function API 방법이 있습니다. 우리는 Sequential API 방법을 활용하여 모델을 만들어 봅시다. 모델의 만드는 원리는 거름종이를 한 층씩 만들어서 한 층씩 통과시키는 것이라고 생각해 주시면 됩니다.
즉, 모델을 만들기 위해서는 layer를 하나씩 쌓아주면 된다.
model = tf.keras.Sequential()
model.add(layers.Embedding(vacab_size, emb_size, input_length = 4))
model.add(layers.Lambda(lambda x: tf.reduce_mean(x, axis = 1)))
model.add(layers.Dense(hidden_dimension, activation='relu'))
model.add(layers.Dense(output_dimension, activation='sigmoid'))
model = tf.keras.Sequential()
Sequential 객체를 생성한 후에 아래에 각 층을 추가하면 됩니다.
model.add(layers.Embedding(vacab_size, emb_size, input_length = 4))
Embedding층으로 입력값을 임베딩하는 부분입니다.
model.add(layers.lambda(lambda x: tf.reduce_mean(x, axis = 1)))
임베딩된 각 단어는 하나의 층으로 되어있지 않습니다. 그래서 다음 층에 넣기 위해 입력값들의 평균을 내어 다름 layer에 넣어주는 처리과정이 필요합니다. 즉, 벡터를 평균하기 위해 람다(Lambda) 층을 넣은 것입니다.
model.add(layers.Dense(hidden_dimension, activation='relu'))
hidden layer는 layer들 사이의 가운데 들어간 layer어라고 생각해 주면 됩니다.
model.add(layers.Dense(output_dimension, activation='sigmoid'))
activation은 활성화 함수를 넣는 것이라고 생각하면 됩니다. 여기서 sigmoid 함수는 출력값의 합이 1이되게 만들어, 각각의 값이 0과 1사이로 만들어 확률을 비교 할 수 있게 한다.
필요 변수
batch_size = 2
num_epopchs = 100
vocab_size = len(word_index) + 1
emb_size = 128
hidden_dimension = 256
output_dimension = 1
위에서 적의한 변수는 학습 과정에서 적용할 배치 사이즈, 에폭 수, 모델의 하이퍼파라미터에 해당하는 여러차원의 크기(임베딩 층, 은닉 층, 출력 층)입니다.
모델이 완성됐다.
3단계. 학습하기
학습하기 위해서는 Keras 내장 API인 compile 메서드와 fit 메서드를 사용하면 됩니다. 우선은 Compile 매서트를 사용해 학습과정을 정의해 봅시다.
model.compile(optimizer = tf.keras.optimizers.Adam(0.001),
loss='binary_crossentropy',
metrics=['accuracy'])
optimizer의 경우 아담(Adam) 최적화 알고리즘을 사용했습니다. 그리고 이진 분류 문제에서 loss값으로는 binary cross-entropy(이진 교차 엔트로피 손실 함수)를 사용합니다다. metrics 부분은 모델의 성능을 측정하기 위한 기준인 평가지표를 정의하는데, 이진 분류의 평가 지표로 가장 널리 사용되는 accuracy(정확도)를 평가 지표로 사용합니다.
이제 fit 메서드로 학습을 진행하면 된다.
model.fit(input_sequences, labels, epochs=num_epochs, batch_size=batch_size)
'인공지능(Artificial Intelligence) > Tensorflow' 카테고리의 다른 글
캐글 데이터 코랩에서받기 (0) | 2021.02.24 |
---|---|
[tensorflow] 데이터 사이즈 변경 기초 (0) | 2021.02.20 |
[tensorflow] 케라스 모델 간단히 구현해보기 (0) | 2020.10.29 |
[tensorflow] 손실함수 정리 (0) | 2020.10.29 |
tensorflow_tf.keras.layers.Dense (0) | 2020.09.18 |
- Total
- Today
- Yesterday
- useState
- Deque
- Queue
- react autoFocus
- JavaScript
- Express
- login
- nodejs
- Python
- typescript
- 자연어처리
- nextjs autoFocus
- next.config.js
- Vue
- 자료구조
- react
- NextJS
- read_csv
- UserCreationForm
- pandas
- mongoDB
- TensorFlow
- 클라우데라
- DFS
- error:0308010C:digital envelope routines::unsupported
- vuejs
- useHistory 안됨
- BFS
- logout
- django
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |