iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 30
0
自我挑戰組

零基礎成為 AI 解夢大師秘笈系列 第 30

【零基礎成為 AI 解夢大師秘笈】Day30 - Django 整合部署 AI model

AI 解夢最終祕笈

前言

系列文章簡介

大家好,我們是 AI . FREE Team - 人工智慧自由團隊,這一次的鐵人賽,自由團隊將從0到1 手把手教各位讀者學會 (1)Python基礎語法 (2)Python Web 網頁開發框架 – Django (3)Python網頁爬蟲 – 周易解夢網 (4)Tensorflow AI語言模型基礎與訓練 – LSTM (5)實際部屬AI解夢模型到Web框架上。

為什麼技術要從零開始寫起

自由團隊的成立宗旨為開發AI/新科技的學習資源,提供各領域的學習者能夠跨域學習資料科學,並透過自主學習發展協槓職涯,結合智能應用到各式領域,無論是文、法、商、管、醫領域的朋友,都可以自由的學習AI技術。

資源

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

教學開始

終於到了成為解夢大師的最後一天,相信讀者們都已經站穩腳步、蹲好馬步,準備開始在江湖上替人解夢改運了吧!本日的教學文章將引導讀者們將開發完成的解夢模型,實際架設到Django上,提供使用者能夠透過網頁介面,進行解夢。

基礎必備知識

  1. Python基礎程式開發
  2. Django網頁開發框架
  3. Python網路爬蟲
  4. Tensorflow - AI語言模型開發(LSTM)

(若尚未熟悉其中任一技術的讀者,歡迎查看自由團隊的對應教學文章!)

為了提升讀者們的開發速度,自由團隊將提供「colab實作程式碼教學」及「Django網頁聊天機器人模板」,透過colab修改聊天機器人的Django模板,部屬LSTM模型。

基礎前置設定

Step 1.
使用 google drive,以利讀取已儲存的模型、tokenizer…等部署資訊。(若在本地端進行部署,此步驟可略。)

# 連結至個人 Google Drive
from google.colab import drive
drive.mount('/content/drive')

Step 2.
下載並解壓縮自由團隊開發的開源Django聊天機器人模板。(若使用自己開發的Django APP,此步驟可略。)

# Git 下載自由團隊-開源 Django 聊天機器人模板
!git clone https://github.com/chenkenanalytic/pro_file.git

# 解壓縮自由團隊-開源 Django 聊天機器人模板 壓縮檔
!7z x /content/pro_file/aifreeteam_c.7z

※ 解壓密碼,請洽 AI . FREE Team 粉絲頁,按讚、私訊:「我想要聊天機器人模板」,就直接免費提供解壓密碼喔!

Step 3.
下載並安裝聊天機器人套件,測試模板是否能正常運作,若想直接開發AI模型部署,此步驟可略。

# 安裝聊天機器人相關套件
!pip install chatterbot==0.8.7
!pip install chatterbot-corpus==1.1.2

# Make migration - 確保開源 Django 專案順利運作
!python /content/aifreeteam_chatbot/manage.py migrate
!python /content/aifreeteam_chatbot/manage.py makemigrations

※ 注意若有出現紅色 Warnings 提醒字眼,記得點擊"RESTART RUNTIME",確保環境套件正常運行。

Step 4.
下載Ngrok並解壓縮 (便於後續我們能跨網域Access colab 的 server)

!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip

Step 5.
透過Ngrok先啟動對外跨網域連線的port網址,並開啟Django網頁。

# 使用 Django 套件語法,開啟並運行 colab Localhost
# 最後透過 Ngrok 套件對公開網域開啟 Access 的權限
get_ipython().system_raw('./ngrok http 8050 &')

import time
time.sleep(1)

!curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

print("=======================================")
!python /content/aifreeteam_chatbot/manage.py runserver 0:8050

透過點擊 Ngrok 所產生的網址,我們便能順利連上在colab本地端運行的Django 網站,也能透過模板介面與chatterbot聊天機器人互動。(如下範例所示)

https://ithelp.ithome.com.tw/upload/images/20201015/20130712WPtilXlIFP.png

進階開發 Django 專案 – AI 模型部署

Step 6. 將 setting.py 的聊天機器人模組進行註解 or 刪除
目的是將聊天機器人的功能關閉,若不關閉,後續操作須注意不要呼叫到 chatterbot 相關套件功能,以避免開發過程額外的錯誤。

path /content/aifreeteam_chatbot/example_app/settings.py

https://ithelp.ithome.com.tw/upload/images/20201015/20130712r8E6Vf6ycV.png
▲ 註解 chatterbot app 如上圖 (快捷鍵:選取程式碼 + ctrl + / )

Step 7. 將 urls.py 聊天機器人的url 進行註解並修改

  • 增加LSTM 模型的 API view 及 url 網址
# url(r'^$', ChatterBotAppView, name='main'),
# url(r'^api/chatterbot/', ChatterBotApiView.as_view(), name='chatterbot'),
url(r'^$', lstm_AppView, name='main'),
url(r'^api/lstm/', lstm_ApiView.as_view(), name='lstm')
  • 將 View 進行修改
# 註解 chatterbot 套件(#from example_app.views import ChatterBotAppView...)
# 新增 LSTM 模型 APP view 套件
from example_app.views import lstm_AppView, lstm_ApiView

https://ithelp.ithome.com.tw/upload/images/20201015/20130712YTsIMMJq2m.png
▲ 範例如上所示

Step 8. 在 Views 中,增加 LSTM 模型運行的 API view
可先在 colab 執行程式碼看看是否有 Error,
若沒有錯誤訊息,可直接於 views.py 檔案新增下述程式碼

  • (1) Keras 模型前置設定、文字生成函式

依據訓練 AI 模型的資訊設定參數及超參數

import tensorflow as tf
import pickle

# 【重要】請設定周易解夢模型資訊======================================
Tokenizer_path = '/content/drive/My Drive/LAB/IT_post/tokenizer.pickle'
model_path = '/content/drive/My Drive/LAB/IT_post/model_01.h5'
w = 5445
EMBEDDING_DIM = 512
RNN_UNITS = 1024
# 【重要】請設定周易解夢模型資訊======================================

讀取開發文字集的 tokenizer

# 讀取先前儲存的 Tokenizer (文字對應數字的索引)
with open(Tokenizer_path, 'rb') as handle:
    tokenizer = pickle.load(handle)

設定模型

# 跟訓練時不同,生成過程的 BATCH_SIZE 改設為 1
BATCH_SIZE = 1

# 定義生成的模型
infer_model = tf.keras.Sequential()
infer_model.add(tf.keras.layers.Embedding(input_dim=w, output_dim=EMBEDDING_DIM, batch_input_shape=[BATCH_SIZE, None]))
infer_model.add(tf.keras.layers.LSTM(units=RNN_UNITS, return_sequences=True, stateful=True))
infer_model.add(tf.keras.layers.Dense(w))

# 載入已儲存模型之權重
infer_model.load_weights(model_path)
infer_model.build(tf.TensorShape([1, None]))

撰寫解夢的函式 (輸入夢境內容 – dream_text、輸出 AI 解夢結果 - text_generated)

def interpret_dream(dream_text):
    text_generated = dream_text
    for i in range(100):
        dream = tokenizer.texts_to_sequences([text_generated])[0]
      
        # 增加 batch 維度丟入模型取得預測結果後
        # 再度降維,拿掉 batch 維度
        input = tf.expand_dims(dream, axis=0)
        predictions = infer_model(input)
        predictions = tf.squeeze(predictions, 0)
      
        temperature = 1.0
        # 利用生成溫度影響抽樣結果
        predictions /= temperature
      
        # 從 4330 個分類值中做抽樣
        # 取得這個時間點模型生成的中文字
        predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
      
        input_eval = tf.expand_dims([predicted_id], 0)
      
        partial_texts = [ tokenizer.index_word[predicted_id] ]
      
        text_generated += partial_texts[0]
      
    # 成功生成 解夢文字檔 → text_generated
    # 透過擷取重點解夢文字作呈現
    return text_generated.split('\n')[0].split('。')[0]
  • (2) API View 對接程式碼

參考 chatterbot API view 的程式碼,修改為 lstm 模型專屬的 API view。

from django.views.generic import View

def lstm_AppView(request):
    template_name = 'app.html'
    csrf_token = get_token(request)
    return render(request, 'app.html',locals())

class lstm_ApiView(View):

    def get_conversation(self, request):

        class Obj(object):
            def __init__(self):
                self.id = None
                self.statements = []

        conversation = Obj()

        conversation.id = request.session.get('conversation_id', 0)
        existing_conversation = False

    def post(self, request, *args, **kwargs):

        input_data = json.loads(request.read().decode('utf-8'))

        if 'text' not in input_data:
            return JsonResponse({
                'text': [
                    'The attribute "text" is required.'
                ]
            }, status=400)

        response = input_data
        raw_text = input_data['text']
        
        text = interpret_dream(raw_text)
        text = ''.join(text).replace('##', '').strip()
        
        response['text'] = text
        response_data = response

        return JsonResponse(response_data, status=200)

確認以上(1) Keras 模型前置設定、文字生成函式及 (2) API View 對接程式碼,若沒有 error 產生,我們可以直接將程式碼貼到 views.py檔案中囉!

Step 9. 修改前端對應的後端函式 id

var chatterbotUrl = '{% url "lstm" %}';

https://ithelp.ithome.com.tw/upload/images/20201015/20130712ZizgSz3W0e.png
▲範例如上

Step 10. 執行 django ,開始解夢囉!

# 透過 Ngrok 套件對公開網域開啟 Access 的權限,檢視結果

get_ipython().system_raw('./ngrok http 8050 &')

import time
time.sleep(1)

!curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

print("=======================================")
!python /content/aifreeteam_chatbot/manage.py runserver 0:8050

雖然我們的網頁介面仍是聊天機器人的使用介面,但是透過對話視窗,我們便可以開始透過打字輸入進行解夢喔!

以下為幾個解夢的範例,雖然有些看起來內容感覺蠻奇異的,但是大致上 AI LSTM 模型,是有抓到解釋夢境的基礎能力。

https://ithelp.ithome.com.tw/upload/images/20201015/20130712P3AB8OVxHp.png
https://ithelp.ithome.com.tw/upload/images/20201015/20130712T8NdHZinza.png

而畢竟是一個簡單的、沒有太多複雜處理、尚未優化的 AI 模型,偶爾也會出現一些比較無厘頭的解夢回覆。(如下範例)

https://ithelp.ithome.com.tw/upload/images/20201015/20130712aOGd2fkk37.png
https://ithelp.ithome.com.tw/upload/images/20201015/20130712bBpSS8ZaLE.png

當然我們也能夠透過修改前端網頁(html),讓介面更完整,使用起來更有感覺!

https://ithelp.ithome.com.tw/upload/images/20201015/20130712LGFvnoZlkA.png

使用 colab 跟 Ngrok 工具,也能讓使用者透過手機、平板等行動設備,連線進行解夢,可說是闔家適宜的一項工具!

這一系列 AI 解夢大師的教學文章就到這邊,當然,此專案仍有許多地方可以優化、改善,例如:爬取更多資料、資料清理的環節更細緻、訓練模型更大、模型更複雜、超參數的微調… etc.

未來若有機會,我們也會針對更進一步的模型(GPT2)、資料處理的細節,進行對外開課,歡迎有興趣的讀者進一步詢問粉絲專頁!
最後還請各位讀者,敬請關注自由團隊粉絲專頁及加入自由團隊學習社群!
https://ithelp.ithome.com.tw/upload/images/20201015/20130712xafxajausU.png
▲ 使用GPT2 訓練出來的解夢模型更完整、更全面

想更深入認識 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/

文章同步發布於:自由團隊部落格
(想看更多文章?學習更多AI知識?敬請鎖定自由團隊的頻道!)


上一篇
【零基礎成為 AI 解夢大師秘笈】Day29 - 周易解夢之人工智慧(10)
系列文
零基礎成為 AI 解夢大師秘笈30

尚未有邦友留言

立即登入留言