構建一個很棒的機器學習專案是一回事,但歸根結底,你希望其他人能夠看到你的辛勤工作。當然,你可以將整個專案放在GitHub上,但是怎麼讓你的祖父母也看到呢?我們想要的是將深度學習模型部署為世界上任何人都可以訪問的Web應用程式。
在本文中,我們將看到如何編寫一個Web應用程式,該應用程式使用經過訓練的Keras遞迴神經網路,並允許使用者生成新的專利文摘。這個專案建立在遞迴神經網路的基礎上,但是了解如何建立RNN是不必要的。
現在我們將其視為黑匣子:我們按一個開始的順序進行操作,它輸出一個全新的專利文摘,可以在瀏覽器中顯示!
傳統上,資料科學家會開發模型,而前端工程師則將模型展示給全世界。在這個專案中,我們必須扮演兩個角色,並投入到Web開發中(儘管幾乎全部使用Python)。
該專案需要將眾多主題結合在一起:
Flask:用Python建立一個基本的Web應用程式Keras:部署訓練有素的遞迴神經網路使用Jinja模板庫建立模板用於編寫網頁的HTML和CSSFlask:http://flask.pocoo.org/Keras:http://keras.io/HTML:https://www.w3schools.com/html/CSS:https://www.w3schools.com/html/html_css.asp最終結果是一個網路應用程式,該應用程式允許使用者使用經過訓練的迴圈神經網路生成全新的專利文摘:
該專案的完整程式碼可在GitHub上找到。
https://github.com/WillKoehrsen/recurrent-neural-networks方法目的是使Web應用程式儘快啟動並執行。為此,我選擇了Flask,它允許我們用Python編寫應用程式。我不喜歡搞亂樣式(這清楚地顯示了),所以幾乎所有的CSS都是複製和貼上的。
Keras團隊的這篇文章(https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html) 對基礎知識很有幫助,本文也是一個有用的指南。
總體而言,該專案遵循我的設計原則:快速啟動並執行原型——根據需要進行復制和貼上,然後進行迭代以製作出更好的產品。
帶Flask的基本Web應用程式用Python構建Web應用程式的最快方法是使用Flask。要製作自己的應用程式,我們可以使用以下內容:
from flask import Flaskapp = Flask(__name__)@app.route("/")def hello(): return "<h1>Not Much Going On Here</h1>"app.run(host='0.0.0.0', port=50000)
如果你複製並貼上此程式碼並執行它,則可以在 localhost:50000上檢視自己的Web應用程式。當然,我們還想做更多的事情,所以我們將使用稍微複雜一點的功能,該功能基本上可以完成相同的工作:處理來自瀏覽器的請求,並以HTML形式提供一些內容。對於我們的主頁,我們想向用戶顯示一個表單以輸入一些詳細資訊。
使用者輸入表當用戶到達應用程式的主頁時,我們將向他們顯示一個帶有三個引數的表單供你選擇:
輸入RNN的開始序列或隨機選擇選擇RNN預測的多樣性選擇RNN輸出的字數要在Python中構建表單,我們將使用wtforms。建立表單的程式碼為:
wtforms:https://wtforms.readthedocs.io/from wtforms import (Form, TextField, validators, SubmitField, DecimalField, IntegerField)class ReusableForm(Form): """User entry form for entering specifics for generation""" # Starting seed seed = TextField("Enter a seed string or 'random':", validators=[ validators.InputRequired()]) # Diversity of predictions diversity = DecimalField('Enter diversity:', default=0.8, validators=[validators.InputRequired(), validators.NumberRange(min=0.5, max=5.0, message='Diversity must be between 0.5 and 5.')]) # Number of words words = IntegerField('Enter number of words to generate:', default=50, validators=[validators.InputRequired(), validators.NumberRange(min=10, max=100, message='Number of words must be between 10 and 100')]) # Submit button submit = SubmitField("Enter")
這將建立如下所示的表單(樣式來自main.css):
該validator程式碼確保使用者輸入正確的資訊。例如,我們檢查所有框是否都已填寫,且其diversity介於0.5到5之間。必須滿足這些條件才能接受該表格。
我們Flask實際提供表單的方式是使用模板。
模板模板是一個包含基本框架的文件,我們需要用它來填充細節。對於Flask Web應用程式,我們可以使用Jinja模板庫將Python程式碼傳遞到HTML文件。例如,在main函式中,我們將把表單的內容傳送到一個名為index.html的檔案.
Jinja模板庫:http://jinja.pocoo.org/from flask import render_template# Home [email protected]("/", methods=['GET', 'POST'])def home(): """Home page of app with form""" # Create form form = ReusableForm(request.form) # Send template information to index.html return render_template('index.html', form=form)
當用戶到達主頁時,我們的應用程式將提供index.html表格上的細節。該模板是一個簡單的html框架,我們在其中使用{{variable}}語法引用python變數。
當用戶輸入資訊並點選submit(POST請求)時,如果資訊是正確的,我們希望將輸入轉移到適當的函式,以使用經過訓練的RNN進行預測。這意味著修改home()。
from flask import request# User defined utility functionsfrom utils import generate_random_start, generate_from_seed# Home [email protected]("/", methods=['GET', 'POST'])def home(): """Home page of app with form""" # Create form form = ReusableForm(request.form) # On form entry and all conditions met if request.method == 'POST' and form.validate(): # Extract information seed = request.form['seed'] diversity = float(request.form['diversity']) words = int(request.form['words']) # Generate a random sequence if seed == 'random': return render_template('random.html', input=generate_random_start(model=model, graph=graph, new_words=words, diversity=diversity)) # Generate starting from a seed sequence else: return render_template('seeded.html', input=generate_from_seed(model=model, graph=graph, seed=seed, new_words=words, diversity=diversity)) # Send template information to index.html return render_template('index.html', form=form)
現在,當用戶點選submit並且資訊正確時,根據輸入的不同,輸入將被髮送到generate_random_start或generate_from_seed。這些函式使用經過訓練的Keras模型生成具有使用者指定的diversity和num_words的新穎專利。這些函式的輸出依次被髮送到其中一個模板random.html或者seeded.html作為一個網頁。
使用預先訓練的Keras模型進行預測模型引數是經過訓練的Keras模型,載入如下:
from keras.models import load_modelimport tensorflow as tfdef load_keras_model(): """Load in the pre-trained model""" global model model = load_model('../models/train-embeddings-rnn.h5') # Required for model to work global graph graph = tf.get_default_graph()load_keras_model()
tf.get_default_graph()是基於這個要點的一種解決方案。
我將不展示這兩個util函式的全部內容(這裡是程式碼),你需要理解的是它們使用經過訓練的Keras模型以及引數,並對新的專利文摘進行預測。
這些函式都返回帶有格式化HTML的Python字串。該字串被髮送到另一個模板以呈現為網頁。例如,generate_random_start返回格式為html,返回結果為random.html:
輸出量generate_random_start選擇一個隨機的專利文摘作為開始序列,並根據該摘要進行預測。然後顯示開始順序,RNN生成的輸出和實際輸出:
該函式generate_from_seed採用使用者提供的起始序列,然後使用經過訓練的RNN對其進行構建。輸出如下:
儘管結果並不總是完全正確,但它們確實表明遞迴神經網路已經學習了英語的基礎知識。經過訓練,可以預測前50個單詞中的下一個單詞,並掌握了如何撰寫具有說服力的專利文摘!
根據預測的多樣性,輸出可能是完全隨機的或迴圈的。
執行應用要自己執行該應用程式,你所需要做的就是下載儲存庫,導航到該deployment目錄並輸入python run_keras_server.py。這將立即使Web應用程式在localhost:10000可用。
根據家庭WiFi的配置方式,你應該能夠使用IP地址從網路上的任何計算機訪問該應用程式。
下一步你的個人計算機上執行的Web應用程式非常適合與朋友和家人共享。我絕對不建議你向家庭網路中的所有人開放此功能!為此,我們想要在AWS EC2例項上設定應用程式並將其提供給全世界(稍後釋出)。
為了改善應用程式,我們可以(通過main.css)更改樣式,並可能新增更多選項,例如選擇經過預先訓練的網路的功能。關於個人專案的偉大之處在於,你可以根據需要擴充套件它們。如果你想使用該應用程式,請下載程式碼並開始使用。
結論在本文中,我們看到了如何將訓練有素的Keras深度學習模型部署為Web應用程式。這需要將多種不同的技術結合在一起,包括遞迴神經網路,Web應用程式,模板,HTML,CSS,當然還有Python。
雖然這只是一個基本的應用程式,但它表明你可以開始使用深度學習來構建web應用程式,而不需要花費太多的精力。
submit = SubmitField("Enter")
在訓練模型中載入。