本文作者:Ovien
自由團隊將從0到1 手把手教各位讀者學會(1)Python基礎語法、(2)Python Web 網頁開發框架 – Django 、(3)Python網頁爬蟲 – 周易解夢網、(4)Tensorflow AI語言模型基礎與訓練 – LSTM、(5)實際部屬AI解夢模型到Web框架上。
AI . FREE Team 讀者專屬福利 → Python Basics 免費學習資源
這次深度學習框架我們採用 keras,有需要請參考上一篇前處理的程式碼。
from keras.models import Model, Input from keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectional,GRU
model = tf.keras.Sequential([ Embedding(len(words), 64), Bidirectional(LSTM(64)), Dense(64, activation='relu'), Dense(5,activation = 'softmax') ])
查看模型的組成
model.summary()
Model: "sequential_5" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_7 (Embedding) (None, None, 64) 21440 _________________________________________________________________ bidirectional_7 (Bidirection (None, 128) 66048 _________________________________________________________________ dense_11 (Dense) (None, 64) 8256 _________________________________________________________________ dense_12 (Dense) (None, 5) 325 ================================================================= Total params: 96,069 Trainable params: 96,069 Non-trainable params: 0 _________________________________________________________________
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
categorical_crossentropy
是一種針對 multi-class or multi-label 的 loss_function。
這裡記得要將資料轉為numpy
的形式,其他參數大家都可以嘗試微調看看
batch_size
是一次丟進去的數量
epochs
是訓練完整資料集的次數
verbose
為是否啟用進度條
如果有驗證集,也可以使用validation_data = (np.array(X_valid_int), np.array(y_oh_valid))
來查看模型的訓練效果。
history = model.fit( np.array(X_train_int), np.array(y_oh_train), batch_size=4, epochs=20, verbose=1, validation_data = (np.array(X_valid_int), np.array(y_oh_valid)), )
Epoch 1/20 46/46 [==============================] - 1s 28ms/step - loss: 1.5894 - accuracy: 0.2732 - val_loss: 1.5550 - val_accuracy: 0.3929 Epoch 2/20 46/46 [==============================] - 0s 10ms/step - loss: 1.5250 - accuracy: 0.3880 - val_loss: 1.4884 - val_accuracy: 0.3750 Epoch 3/20 46/46 [==============================] - 0s 11ms/step - loss: 1.3422 - accuracy: 0.3825 - val_loss: 1.2045 - val_accuracy: 0.5179 Epoch 4/20 46/46 [==============================] - 0s 11ms/step - loss: 0.8867 - accuracy: 0.6557 - val_loss: 1.2385 - val_accuracy: 0.6429 Epoch 5/20 46/46 [==============================] - 0s 11ms/step - loss: 0.4955 - accuracy: 0.7978 - val_loss: 1.6667 - val_accuracy: 0.6786 ... ... ... Epoch 19/20 46/46 [==============================] - 1s 11ms/step - loss: 6.8749e-04 - accuracy: 1.0000 - val_loss: 2.6845 - val_accuracy: 0.7857 Epoch 20/20 46/46 [==============================] - 0s 11ms/step - loss: 5.7524e-04 - accuracy: 1.0000 - val_loss: 2.7143 - val_accuracy: 0.7857
我們使用matplotlib
的折線圖plt.plot
hist = pd.DataFrame(history.history) plt.figure(figsize=(12,12)) plt.plot(hist["accuracy"]) plt.plot(hist["val_accuracy"]) plt.show()
idx = 5test_pred = model.predict(np.array(X_valid_int)[idx]) anwser = max(sum(test_pred)) for index,i in enumerate(sum(test_pred)): if i == anwser: print(f'sentence : {[idx2word[k] for k in X_valid_int[idx]]}') print(f'predict : {label_to_emoji(index)}')
sentence : ['he', 'is', 'a', 'good', 'friend', 'pad', 'pad', 'pad', 'pad', 'pad'] predict : ❤️
※ 大家可以隨機調用 idx
來測試不同的句子
自由團隊 官方網站:https://aifreeblog.herokuapp.com/
自由團隊 Github:https://github.com/AI-FREE-Team/
自由團隊 粉絲專頁:https://www.facebook.com/AI.Free.Team/
自由團隊 IG:https://www.instagram.com/aifreeteam/
自由團隊 Youtube:https://www.youtube.com/channel/UCjw6Kuw3kwM_il39NTBJVTg/
文章同步發布於:第十二屆 IT 挑戰賽部落格