#์์
๋ก์ดํฐ(Reuters) ๋ด์ค ๋ฐ์ดํฐ์ ์ผ๋ก ๋จ์ผ ๋ ์ด๋ธ ๋ค์ค ๋ถ๋ฅ ๋ฌธ์ ๋ค๋ฃจ๊ธฐ
๋ชฉ์ : ํ ์คํธ ๋ถ๋ฅ
11258๊ฐ์ ๊ธฐ์ฌ์ 46๊ฐ์ ๋ด์ค ์นดํ ๊ณ ๋ฆฌ ๋ถ๋ฅ. ๊ฐ ํ ํฝ์ ์ต์ 10๊ฐ์ด์์ ์ํ์ด ์์.
from keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words = 10000)
#๋ก์ดํฐ ๋ฐ์ดํฐ์
๊ฐ์ ธ์ค๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ์์ ๋ฃ์ด์ค
#ํ๋ จ์ฉ๋ฐ์ดํฐ์ ๊ฒ์ฆ์ฉ ๋ฐ์ดํฐ ๋ช๊ฐ๋ก ๋ถ๋ฅ๋์๋์ง ์ถ๋ ฅ.
print(len(train_data))
print(len(test_data))
print(train_data[1]) #2์ฐจ์ ๋ฐฐ์ด๋ก ๋ค์ด๊ฐ์์
print(train_labels[0]) #1์ฐจ์ ๋ฐฐ์ด๋ก ๋ค์ด๊ฐ์์.
import numpy as np
def vectorize_sequences ( sequences, dimension = 10000):
#์
๋ ฅ๋ฐ์ดํฐ๋งํผ์ ์ด์ ๋ง๋ค๊ณ ๊ฐ ํ์ ํฌ๊ธฐ๋ 10000์ผ๋ก ์ค์ , ๊ฐ์ 0์ผ๋ก 2์ฐจ์๋ฐฐ์ด๋ง๋ฌ
results = np.zeros((len(sequences), dimension))
#i๋ 0,1,2,...์ฒ๋ผ ์์. sequnce๋ ์
๋ ฅ๋ฐ์ดํฐ์ ์์๋ณ ๊ฐ ์์๊ฐ
for i, sequence in enumerate(sequences) :
#0๋ฒ์งธ ํ์ 0๋ฒ์งธ ์์๊ฐ ์ด์ ๊ฐ์ ์ค์ํ 1.00 ์ฝ์
results[i,sequence] = 1.
return results
# ์ด ํจ์๋ฅผ ํตํด ์์ ๊ฐ์ด ์์ผ๋ฉด 1, ๊ฐ์ด ์์ผ๋ฉด 0์ผ๋ก ์ ๊ทํ
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
#ํ์ธ
print(len(x_train))
print(len(x_test))
print(len(x_train[0]))
print(x_train[0])
print(len(x_test[0]))
print(x_test[0])
import keras
one_hot_train_labels = keras.utils.to_categorical(train_labels)
one_hot_test_labels = keras.utils.to_categorical(test_labels)
print(len(one_hot_train_labels)) #๋๋ฉ์
์ด 46์
print(len(one_hot_test_labels[0]))
์ฌ๊ธฐ์ train_data์ test_data๋ ํ์ด์ฌ ๋ฆฌ์คํธ์ ๋ํ์ด ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ to_categorical() ํจ์๋ฅผ ์ฌ์ฉํ์ง ๋ชปํจ.
x_train๊ณผ x_test์ ํฌ๊ธฐ๋ ๊ฐ๊ฐ (8982, 10000), (2246, 10000)์ด ๋๊ณ ,
one_hot_train_labels์ one_hot_test_labels์ ํฌ๊ธฐ๋ ๊ฐ๊ฐ (8982, 46), (2246, 46).
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape = (10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
#๊ฐ ์
๋ ฅ ์ํ์ ๋ํด์ 46์ฐจ์์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅ /
#์ด ๋ฒกํฐ์ ๊ฐ ์์(๊ฐ ์ฐจ์)๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ถ๋ ฅ ํด๋์ค๊ฐ ์ธ์ฝ๋ฉ๋ ๊ฒ /
#ํ๋ฅ ๋ถํฌ
๋ง์ง๋ง Dense ์ธต์ ํฌ๊ธฐ๊ฐ 46.
๊ฐ ์ ๋ ฅ ์ํ์ ๋ํด์ 46์ฐจ์์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํ๋ค๋ ๋ป.
์ด ๋ฒกํฐ์ ๊ฐ ์์(๊ฐ ์ฐจ์)๋ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ถ๋ ฅ ํด๋์ค๊ฐ ์ธ์ฝ๋ฉ๋ ๊ฒ.
๋ง์ง๋ง ์ธต์ softmax ํ์ฑํ ํจ์ ์ฌ์ฉ.
๊ฐ ์ ๋ ฅ ์ํ๋ง๋ค 46๊ฐ์ ์ถ๋ ฅ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ถํฌ๋ฅผ ์ถ๋ ฅ.
์ฆ 46์ฐจ์์ ์ถ๋ ฅ ๋ฒกํฐ๋ฅผ ๋ง๋ค๋ฉฐ output[i]๋ ์ด๋ค ์ํ์ด ํด๋์ค i์ ์ํ ํ๋ฅ .
46๊ฐ์ ๊ฐ์ ๋ชจ๋ ๋ํ๋ฉด 1.
model.compile(optimizer='rmsprop',loss='categorical_crossentropy', metrics=['accuracy'])
์ด๋ฐ ๋ฌธ์ ์ ์ฌ์ฉํ ์ต์ ์ ์์ค ํจ์๋ categorical_crossentropy.
์ด ํจ์๋ ๋ ํ๋ฅ ๋ถํฌ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ .
๋คํธ์ํฌ๊ฐ ์ถ๋ ฅํ ํ๋ฅ ๋ถํฌ์ ์ง์ง ๋ ์ด๋ธ์ ํ๋ฅ ๋ถํฌ ์ฌ์ด์ ๊ฑฐ๋ฆฌ.
๋ ๋ถํฌ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ต์ํํ๋ฉด ์ง์ง ๋ ์ด๋ธ์ ๊ฐ๋ฅํ ๊ฐ๊น์ด ์ถ๋ ฅ์ ๋ด๋๋ก ๋ชจ๋ธ์ ํ๋ จ.
x_val = x_train[:1000] #๋ค์์ ์ฒ๊ฐ ๋์ ๊ฒ์ฆ์ฉ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ
partial_x_train = x_train[1000:] #7982๊ฐ.
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
history = model.fit(partial_x_train, partial_y_train, epochs=20, batch_size=512, validation_data=(x_val, y_val))
import matplotlib.pyplot as plt
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss) + 1)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend() #ํ๋์ ๊ทธ๋ํ์์ ๊ทธ๋ฆฌ๊ธฐ?
plt.show()
plt.clf()
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
์ํฌํฌ ํ 9์ฏค์ผ๋ก ๋ค์์ก๊ณ ๋ชจ๋ธ ์ฌํ๋ จ.(overfitting)
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(partial_x_train,
partial_y_train,
epochs=9,
batch_size=512,
validation_data=(x_val, y_val))
results = model.evaluate(x_test, one_hot_test_labels)
print(results)
๋ชจ๋ธ ์ ํ๋์ฝ 78%์ ๋.
๊ท ํ ์กํ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ๋ ๋ฌด์์ ๋ถ๋ฅ์ผ ๋ 50%์ ๋์ ์ ํ๋์ด๊ณ ,
๋ถ๊ท ํํ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ์ฌ ๋ฌด์์ ๋ถ๋ฅํ๋ฉด 18%์ ๋ ๋์ค๋๋ฐ
์ด ๋ฐ์ดํฐ์ ์ ๋ถ๊ท ํํ ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํจ์ผ๋ก ์๋นํ ๊ด์ฐฎ์ ์ ํ๋.