作者|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/
-
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 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=https://www.cnblogs.com/panchuangai/p/"/static/css/main.css">
<link rel="shortcut icon" href="/static/images/lstm.ico">
<body>
Writing Novel Patent Abstracts with Recurrent Neural Networks
{% block content %}
{% for message in form.seed.errors %}
{{ message }}
{% endfor %}
{% for message in form.diversity.errors %}
{{ message }}
{% endfor %}
{% for message in form.words.errors %}
{{ message }}
{% endfor %}
{% endblock %}
