Day28 - 人工智慧 IX.

斜槓學習 – 零基礎成為 AI 解夢大師秘笈

本文作者:Ovien

系列文章簡介

自由團隊將從0到1 手把手教各位讀者學會(1)Python基礎語法、(2)Python Web 網頁開發框架 – Django 、(3)Python網頁爬蟲 – 周易解夢網、(4)Tensorflow AI語言模型基礎與訓練 – LSTM、(5)實際部屬AI解夢模型到Web框架上。

學習資源

AI . FREE Team 讀者專屬福利 → Python Basics 免費學習資源

實作 Part - 2

這次深度學習框架我們採用 keras,有需要請參考上一篇前處理的程式碼。

導入套件

from keras.models import Model, Input
from keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectional,GRU

model

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。

Training - 開始訓練

這裡記得要將資料轉為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 來測試不同的句子

想更深入認識 AI . FREE Team ?

自由團隊 官方網站: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 挑戰賽部落格

(繼續閱讀下一篇教學...)