머신러닝/Tensorflow

Tensorflow 2.0 - Basic text classification

aiemag 2021. 3. 7. 11:28
반응형

Text 의 분류 예제입니다.

 

keras.datasets 에서 제공하는 IMDB 리뷰셋을 이용해서 긍정(1), 부정(1)에 대한 평가에 대한 분류를 하는 내용입니다.

 

dataset은 각 text에 포함되는 단어가 단어사전의 index 로 치환되어 제공되고, 최대 256 개의 단어 index를 포함합니다.

 

train, test dataset의 각 text별 포함되는 단어 개수가 다르기 때문에 padding 작업이 필요합니다.

 

model 구성 시, 이미지분류 때와는 달리 Embedding layer를 입력층으로 합니다.

 

Code

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import tensorflow as tf
from tensorflow import keras
 
import numpy as np
 
# load data
imdb = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
 
word_index = imdb.get_word_index()
 
word_index = {k:(v+3for k,v in word_index.items()}
word_index["<PAD>"= 0
word_index["<START>"= 1
word_index["<UNK>"= 2
word_index["<UNUSED>"= 3
 
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
 
def decode_review(text):
    return ' '.join([reverse_word_index.get(i) for i in text])
 
 
# preprocess
# - adjusting the length of dataset as same
train_data = keras.preprocessing.sequence.pad_sequences(train_data,
                                                        value=word_index["<PAD>"],
                                                        padding='post',
                                                        maxlen=256)
 
test_data = keras.preprocessing.sequence.pad_sequences(test_data,
                                                       value=word_index["<PAD>"],
                                                       padding='post',
                                                       maxlen=256)
 
 
# make model
vocab_size = 10000
 
model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.summary()
 
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
 
# make validation set
x_val = train_data[:10000]
partial_x_train = train_data[10000:]
 
y_val = train_labels[:10000]
partial_y_train = train_labels[10000:]
 
# train model
history = model.fit(partial_x_train, 
                    partial_y_train,
                    epochs=40,
                    batch_size=512,
                    validation_data=(x_val, y_val),
                    verbose=1)
 
 
results = model.evaluate(test_data, test_labels, verbose=2)
print(results)
cs

 

 

결과

단순한 전처리와 model training 만으로 loss값 0.33, accuracy가 0.87이나 나왔습니다.

반응형

'머신러닝 > Tensorflow' 카테고리의 다른 글

Tensorflow 2.0 - Text classification by TF Hub  (0) 2021.03.08
Tensorflow 2.0 - Basic image classification  (0) 2021.03.06
Tensorflow 2.0 - Tutorial  (0) 2021.03.05