File size: 2,648 Bytes
9a24bb1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
67
68
69
70
71
72
73
import tensorflow as tf
from tensorflow import keras
import numpy as np
from keras import layers

# ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ 1๋งŒ๊ฐœ ๋‹จ์–ด๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=10000)

print(f"ํŒจ๋”ฉ ์ „ ์ฒซ ๋ฒˆ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")

# ๋ชจ๋“  ์‹œํ€€์Šค์˜ ๊ธธ์ด๋ฅผ 256์œผ๋กœ ํ†ต์ผ
# maxlen๋ณด๋‹ค ๊ธธ๋ฉด ์ž˜๋ผ๋‚ด๊ณ , ์งง์œผ๋ฉด ์•ž๋ถ€๋ถ„์„ 0์œผ๋กœ ์ฑ„์›€ (pre-padding)
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=256)
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=256)

print(f"ํŒจ๋”ฉ ํ›„ ์ฒซ ๋ฒˆ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")

# ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ์ •์˜
model = keras.Sequential([
    # 1. ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ์ธต
    # input_dim: ์ „์ฒด ๋‹จ์–ด ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ (๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ 1๋งŒ๊ฐœ ๋‹จ์–ด)
    # output_dim: ๊ฐ ๋‹จ์–ด๋ฅผ ํ‘œํ˜„ํ•  ๋ฒกํ„ฐ์˜ ์ฐจ์› (32์ฐจ์›)
    keras.layers.Embedding(input_dim=10000, output_dim=32),
    
    # 2. RNN ์ธต
    # units: ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ์˜ ์ฐจ์› (32์ฐจ์›)
    keras.layers.SimpleRNN(32),
    
    # 3. ์ตœ์ข… ๋ถ„๋ฅ˜๊ธฐ(Classifier)
    # units: ์ถœ๋ ฅ ๋‰ด๋Ÿฐ์˜ ์ˆ˜ (๊ธ์ •/๋ถ€์ • 1๊ฐœ)
    # activation: ์ถœ๋ ฅ ๊ฐ’์„ 0~1 ์‚ฌ์ด ํ™•๋ฅ ๋กœ ๋ณ€ํ™˜ (์ด์ง„ ๋ถ„๋ฅ˜)
    keras.layers.Dense(1, activation="sigmoid"),
])


model.compile(
    # ์†์‹ค ํ•จ์ˆ˜: ์˜ˆ์ธก์ด ์ •๋‹ต๊ณผ ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅธ์ง€ ์ธก์ •.
    # ์ด์ง„ ๋ถ„๋ฅ˜(0 ๋˜๋Š” 1) ๋ฌธ์ œ์ด๋ฏ€๋กœ binary_crossentropy๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉ.
    loss="binary_crossentropy",
    
    # ์˜ตํ‹ฐ๋งˆ์ด์ €: ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
    # Adam์€ ํ˜„์žฌ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ค‘ ํ•˜๋‚˜.
    optimizer="adam",
    
    # ํ‰๊ฐ€์ง€ํ‘œ: ํ›ˆ๋ จ ๊ณผ์ •์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ง€ํ‘œ. ์ •ํ™•๋„๋ฅผ ์‚ฌ์šฉ.
    metrics=["accuracy"]
)

batch_size = 128
epochs = 10

# ๋ชจ๋ธ ํ•™์Šต ์‹คํ–‰
# validation_data๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋งค ์—ํฌํฌ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์„ฑ๋Šฅ์„ ๊ฒ€์ฆ
history = model.fit(
    x_train, y_train,
    batch_size=batch_size,
    epochs=epochs,
    validation_data=(x_test, y_test)
)

# ํ•™์Šต ์™„๋ฃŒ ํ›„ ์ตœ์ข… ์„ฑ๋Šฅ ํ‰๊ฐ€
score = model.evaluate(x_test, y_test, verbose=0)
print(f"\nTest loss: {score[0]:.4f}")
print(f"Test accuracy: {score[1]:.4f}")

# ๋ชจ๋ธ์˜ ๊ตฌ์กฐ, ๊ฐ€์ค‘์น˜, ํ•™์Šต ์„ค์ •์„ ๋ชจ๋‘ '.keras' ํŒŒ์ผ ํ•˜๋‚˜์— ์ €์žฅ
model.save("my_rnn_model_imdb.keras")

# ๋ชจ๋ธ ๊ตฌ์กฐ ์š”์•ฝ ์ถœ๋ ฅ
model.summary()

# ์ €์žฅ๋œ ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
loaded_model = keras.models.load_model("my_rnn_model_imdb.keras")