作者|Will Koehrsen
編譯|Flin
來源|towardsdatascience
構建一個很棒的機器學習項目是一回事,但歸根結底,你希望其他人能夠看到你的辛勤工作。當然,你可以將整個項目放在GitHub上,但是怎么讓你的祖父母也看到呢?我們想要的是將深度學習模型部署為世界上任何人都可以訪問的Web應用程序。
在本文中,我們將看到如何編寫一個Web應用程序,該應用程序使用經過訓練的Keras遞歸神經網絡,並允許用戶生成新的專利文摘。這個項目建立在遞歸神經網絡的基礎上,但是了解如何創建RNN是不必要的。
現在我們將其視為黑匣子:我們按一個開始的順序進行操作,它輸出一個全新的專利文摘,可以在瀏覽器中顯示!
傳統上,數據科學家會開發模型,而前端工程師則將模型展示給全世界。在這個項目中,我們必須扮演兩個角色,並投入到Web開發中(盡管幾乎全部使用Python)。
該項目需要將眾多主題結合在一起:
-
Flask:用Python創建一個基本的Web應用程序
-
Keras:部署訓練有素的遞歸神經網絡
-
使用Jinja模板庫創建模板
-
用於編寫網頁的HTML和CSS
-
Flask:http://flask.pocoo.org/
-
Keras:http://keras.io/
最終結果是一個網絡應用程序,該應用程序允許用戶使用經過訓練的循環神經網絡生成全新的專利文摘:
該項目的完整代碼可在GitHub上找到。
方法
目的是使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 Flask
app = 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 page
@app.route("/", 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變量。
<!DOCTYPE html>
<html>
<head>
<title>RNN Patent Writing</title>
<link rel="stylesheet" href="/static/css/main.css">
<link rel="shortcut icon" href="/static/images/lstm.ico">
</head>
<body>
<div class="container">
<h1>
<center>Writing Novel Patent Abstracts with Recurrent Neural Networks</center>
</h1>
{% block content %}
{% for message in form.seed.errors %}
<div class="flash">{{ message }}</div>
{% endfor %}
{% for message in form.diversity.errors %}
<div class="flash">{{ message }}</div>
{% endfor %}
{% for message in form.words.errors %}
<div class="flash">{{ message }}</div>
{% endfor %}
<form method=post>
{{ form.seed.label }}
{{ form.seed }}
{{ form.diversity.label }}
{{ form.diversity }}
{{ form.words.label }}
{{ form.words }}
{{ form.submit }}
</form>
{% endblock %}
</div>
</body>
</html>
對於表單中的每個錯誤(那些無法驗證的條目),對應的一個錯誤將閃爍。除此之外,此文件將顯示上述表單。
當用戶輸入信息並點擊submit
(POST請求)時,如果信息是正確的,我們希望將輸入轉移到適當的函數,以使用經過訓練的RNN進行預測。這意味着修改home()
。
from flask import request
# User defined utility functions
from utils import generate_random_start, generate_from_seed
# Home page
@app.route("/", 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_model
import tensorflow as tf
def 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
:
<!DOCTYPE html>
<html>
<header>
<title>Random Starting Abstract
</title>
<link rel="stylesheet" href="/static/css/main.css">
<link rel="shortcut icon" href="/static/images/lstm.ico">
<ul>
<li><a href="/">Home</a></li>
</ul>
</header>
<body>
<div class="container">
{% block content %}
{{input|safe}}
{% endblock %}
</div>
</body>
</html>
這里我們再次使用Jinja
模板引擎來顯示格式化的HTML
。因為Python字符串已經被格式化為HTML,我們所要做的就是使用{{input| safe}}
(其中input是Python變量)來顯示它。然后我們就可以在main.css
設計這個頁面的樣式了, 和其他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")
在訓練模型中加載。
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/