from tensorflow.keras.datasets import imdb
(train_input, train_target), (test_input, test_target) = imdb.load_data(
num_words=500)
print(train_input.shape, test_input.shape)
print(train_input[0])
print(train_target[:20])
(25000,) (25000,)
[1, 14, 22, 16, 43, 2, 2, 2, 2, 65, 458, ...
-> '1' : ์ํ์ ์์ ๋ถ๋ถ์ ์๋ฏธ // '2' : 500๊ฐ ๋จ์ด์ ํฌํจ๋์ง ์์ ๋จ์ด
[1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 0 1]
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
train_input, val_input, train_target, val_target = train_test_split(
train_input, train_target, test_size=0.2, random_state=42
)
lengths = np.array([len(x) for x in train_input])
print(np.mean(lengths), np.median(lengths))
plt.hist(lengths)
plt.xlabel('length')
plt.ylabel('frequency')
plt.show()
237.9088125 179.0 // ํ๊ท ๊ฐ > ์ค๊ฐ๊ฐ
๋ฌธ์ฅ์ ๊ธธ์ด๋ฅผ ์ง์ ํด์ ์๋ฅด๊ฑฐ๋ ๋น ๊ณณ์ 0์ผ๋ก ํจ๋ฉ
(์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์ฅ์ ์๋ถ๋ถ์ ์๋ฅด๊ฑฐ๋ ํจ๋ฉํจ)
ํ ํฐ = ๋จ์ด ๊ฐ์ = ํ์์คํ = 100
from tensorflow.keras.preprocessing.sequence import pad_sequences
train_seq = pad_sequences(train_input, maxlen=100)
val_seq = pad_sequences(val_input, maxlen=100)
print(train_seq.shape)
(20000, 100) // ์ํ, ํ ํฐ
from tensorflow import keras
model = keras.Sequential()
model.add(keras.layers.SimpleRNN(8, input_shape=(100, 500)))
model.add(keras.layers.Dense(1, activation='sigmoid'))
train_oh = keras.utils.to_categorical(train_seq)
val_oh = keras.utils.to_categorical(val_seq)
print(train_oh.shape)
print(train_oh[0][0][:12])
print(np.sum(train_oh[0][0]))
(20000, 100, 500)
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
1.0 // ์์ ํ๋๋ง 1
RNN Param
500๊ฐ ํ ํฐ(์ํซ) x 8๊ฐ ๋ด๋ฐ ์์ ์ฐ๊ฒฐ
+8๊ฐ ์ํ๋๋ ์๋์ํ h x 8๊ฐ ๋ด๋ฐ ์์ ์ฐ๊ฒฐ
+8๊ฐ ์ ํธ
= 4072
Dense Param
8๊ฐ ๋ด๋ฐ x 1๊ฐ ๊ฐ์ค์น
+1๊ฐ ์ ํธ
= 9
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-simplernn-model.h5', save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)
history = model.fit(train_oh, train_target, epochs=100, batch_size=64,
validation_data=(val_oh, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
-> 80% ์ ํ๋
-> ๋ฐ์ดํฐ๊ฐ ๋์ด๋ ์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น ์ฌํจ
model2 = keras.Sequential()
model2.add(keras.layers.Embedding(500, 16, input_length=100))
model2.add(keras.layers.SimpleRNN(8))
model2.add(keras.layers.Dense(1, activation='sigmoid'))
model2.summary()
Embedding Param
100๊ฐ ํ ํฐ -> 16 ์ฐจ์ ์ค์ ๋ฒกํฐ
x ๊ฐ์ค์น 500
= 8000
SimpleRNN Param
16๊ฐ ์ถ๋ ฅ x 8๊ฐ ๋ด๋ฐ
+8๊ฐ ์๋์ํ x 8๊ฐ ๋ด๋ฐ
+8๊ฐ ์ ํธ
= 200
-> ๋น์ทํ ๊ฒฐ๊ณผ
๐ ํผ๊ณต MLDL-24