用Python将Keras深度学习模型部署为Web应用程序的示例分析,很多新手对此不是很清楚。为了帮助大家解决这个问题,下面小编就为大家详细讲解一下。需要的人可以从中学习,希望你能有所收获。
建立一个伟大的机器学习项目是一回事,但归根结底,你希望别人看到你的努力。当然可以把整个项目放到GitHub上,但是你爷爷奶奶怎么看?我们想要的是将深度学习模型部署为世界上任何人都可以访问的网络应用程序。
在本文中,我们将看到如何编写一个Web应用程序,该应用程序使用经过训练的Keras递归神经网络,并允许用户生成新的专利摘要。这个项目是基于递归神经网络,但不需要知道如何创建RNN。
现在我们把它当成一个黑盒:我们按启动顺序操作,它输出一个全新的专利摘要,可以在浏览器中显示!
传统上,数据科学家将开发模型,而前端工程师将向世界展示它们。在这个项目中,我们必须扮演两个角色,并致力于网络开发(尽管几乎所有人都使用Python)。
该项目需要结合许多主题:
Flask:用Python创建一个基本的网络应用程序
Keras:部署一个训练有素的递归神经网络
使用Jinja模板库创建模板
编写网页的HTML和CSS
烧瓶:http://flask.pocoo.org/
http://keras.io/
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)对基础知识很有帮助,这篇文章也是很有用的指南。
总的来说,这个项目遵循我的设计原则:快速启动并运行prototype ——,根据需要复制粘贴,然后迭代,做出更好的产品。
00-1010用Python构建Web应用程序最快的方法是使用Flask。要制作我们自己的应用程序,我们可以使用以下内容:
fromflaskimportFlask
app=Flask(__name__)
@app.route('/')
defhello():
返回' h2不太多正在进行/h2 '
App.run(主机=' 0.0.0.0 ',端口=50000)如果您复制并粘贴此代码并运行它,您可以在localhost:50000上查看您的Web应用程序。当然,我们想做更多的事情,所以我们将使用稍微复杂一点的功能,它基本上可以做同样的工作:处理来自浏览器的请求,并以HTML形式提供一些内容。对于我们的主页,我们希望向用户显示一个表单来输入一些细节。
00-1010当用户到达应用程序的主页时,我们将向他们显示一个包含三个参数的表单,供您选择:
输入RNN或随机选择的开始顺序。
选择RNN预测的多样性。
选择RNN输出的字数
为了用Python构建一个表单,我们将使用wtforms。创建表单的代码是:
wtforms:https://wtforms.readth
edocs.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">
<h2>
<center>Writing Novel Patent Abstracts with Recurrent Neural Networks</center>
</h2>
{% 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.h6')
# 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)更改样式,并可能添加更多选项,例如选择经过预先训练的网络的功能。关于个人项目的伟大之处在于,你可以根据需要扩展它们。如果你想使用该应用程序,请下载代码并开始使用。
-
代码下载:https://github.com/WillKoehrsen/recurrent-neural-networks

在本文中,我们看到了如何将训练有素的Keras深度学习模型部署为Web应用程序。这需要将多种不同的技术结合在一起,包括递归神经网络,Web应用程序,模板,HTML,CSS,当然还有Python。
虽然这只是一个基本的应用程序,但它表明你可以开始使用深度学习来构建web应用程序,而不需要花费太多的精力。
submit = SubmitField("Enter")
在训练模型中加载。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/102827.html
