为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...

c73c54bc08b8a1a3ce23c5fa78d5b097.png

构建一个很棒的机器学习项目是一回事,但归根结底,你希望其他人能够看到你的辛勤工作。当然,你可以将整个项目放在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

最终结果是一个网络应用程序,该应用程序允许用户使用经过训练的循环神经网络生成全新的专利文摘:

4d15648b96db086de761a616ce6600f0.gif

该项目的完整代码可在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 "

Not Much Going On Here

"app.run(host='0.0.0.0', port=50000)

如果你复制并粘贴此代码并运行它,则可以在 localhost:50000上查看自己的Web应用程序。当然,我们还想做更多的事情,所以我们将使用稍微复杂一点的功能,该功能基本上可以完成相同的工作:处理来自浏览器的请求,并以HTML形式提供一些内容。对于我们的主页,我们想向用户显示一个表单以输入一些详细信息。

用户输入表

当用户到达应用程序的主页时,我们将向他们显示一个带有三个参数的表单供你选择:

  1. 输入RNN的开始序列或随机选择
  2. 选择RNN预测的多样性
  3. 选择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):

e14e754f6768e9f805e88c2fdb868adc.png

该validator代码确保用户输入正确的信息。例如,我们检查所有框是否都已填写,且其diversity介于0.5到5之间。必须满足这些条件才能接受该表格。

fd9f8cccb8147ce00d361969f591ffbb.png

我们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变量。

  RNN Patent Writing

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 %} {{ form.seed.label }} {{ form.seed }} {{ form.diversity.label }} {{ form.diversity }} {{ form.words.label }} {{ form.words }} {{ form.submit }} {% endblock %}

对于表单中的每个错误(那些无法验证的条目),对应的一个错误将闪烁。除此之外,此文件将显示上述表单。

当用户输入信息并点击submit(POST请求)时,如果信息是正确的,我们希望将输入转移到适当的函数,以使用经过训练的RNN进行预测。这意味着修改home()。

from flask import request# User defined utility functionsfrom 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_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:

Random Starting Abstract    
Home
{% block content %} {{input|safe}} {% endblock %}

这里我们再次使用Jinja模板引擎来显示格式化的HTML。因为Python字符串已经被格式化为HTML,我们所要做的就是使用{{input| safe}}(其中input是Python变量)来显示它。然后我们就可以在main.css设计这个页面的样式了, 和其他html模板一样。

输出量

generate_random_start选择一个随机的专利文摘作为开始序列,并根据该摘要进行预测。然后显示开始顺序,RNN生成的输出和实际输出:

cc76ca316c5864dcac4bdf1ee41e11ff.png

该函数generate_from_seed采用用户提供的起始序列,然后使用经过训练的RNN对其进行构建。输出如下:

4a2323dcc8cd0d2cd43cb8eecb7fc0ed.png

尽管结果并不总是完全正确,但它们确实表明递归神经网络已经学习了英语的基础知识。经过训练,可以预测前50个单词中的下一个单词,并掌握了如何撰写具有说服力的专利文摘!

根据预测的多样性,输出可能是完全随机的或循环的。

运行应用

要自己运行该应用程序,你所需要做的就是下载存储库,导航到该deployment目录并输入python run_keras_server.py。这将立即使Web应用程序在localhost:10000可用。

根据家庭WiFi的配置方式,你应该能够使用IP地址从网络上的任何计算机访问该应用程序。

下一步

你的个人计算机上运行的Web应用程序非常适合与朋友和家人共享。我绝对不建议你向家庭网络中的所有人开放此功能!为此,我们想要在AWS EC2实例上设置应用程序并将其提供给全世界(稍后发布)。

为了改善应用程序,我们可以(通过main.css)更改样式,并可能添加更多选项,例如选择经过预先训练的网络的功能。关于个人项目的伟大之处在于,你可以根据需要扩展它们。如果你想使用该应用程序,请下载代码并开始使用。

  • 代码下载:https://github.com/WillKoehrsen/recurrent-neural-networks
6c437f4d7002fd4f87e438d0fd7e9f91.gif

结论

在本文中,我们看到了如何将训练有素的Keras深度学习模型部署为Web应用程序。这需要将多种不同的技术结合在一起,包括递归神经网络,Web应用程序,模板,HTML,CSS,当然还有Python。

虽然这只是一个基本的应用程序,但它表明你可以开始使用深度学习来构建web应用程序,而不需要花费太多的精力。

submit = SubmitField("Enter")

在训练模型中加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos 源码安装mysql5.6_CentOS 7下源码安装MySQL 5.6

目录准备工作运行环境确认你的安装版本下载MySQL安装MySQL准备安装环境编译和安装配置MySQL单实例配置单实例配置方法添加防火墙启动MySQL重启MySQL多实例配置什么是多实例多实例配置方法创建启动文件初始化数据库配置防火墙启动MySQL登陆MySQL重启MySQL准备工作运行环境本文的…

跳一跳

转载于:https://www.cnblogs.com/shanhua-fu/p/8807348.html

树莓派 无法安装mysql_树莓派安装mysql

前置,更新系统sudo apt-get updatesudo apt-get upgrade安装与配置MySQL直接安装mysql的话,默认下载的是MariaDB,两者差别不大,用法一样。如果真想下载mysql,需要换源,新版的Linux系统自带的是MariaDB&…

ABP框架使用 Swagger

在最近的一个项目中用到了 ABP框架 http://aspnetboilerplate.com/ ,第一次接触到 Swagger https://swagger.io/ 以及前后端的完全分离 在ABP官网下载下来的ABP框架结构【基于ASP.NET MVC5.x的】如图: ABP的EntityFramework 是Code First Mode的,所以在配…

JVM第五部分 高效并发

java 内存模型与线程 硬件内存模型 java内存模型 主内存vs工作内存 所有变量都在主内存(虚拟机内存的一部分),每条线程都有自己的工作内存,线程所有用到的变量都必须从主内存拷贝出来(不能直接读写主内存变量&#xff…

hadoop元数据mysql中表字段_hive mysql元数据表说明

2019独角兽企业重金招聘Python工程师标准>>>数据库相关的表DBS该表存储Hive中所有数据库的基本信息,字段如下:元数据表字段说明示例数据DB_ID数据库ID2DESC数据库描述测试库DB_LOCATION_URI数据库HDFS路径hdfs://namenode/user/hive/warehouse/…

CentOs7.2编译安装Nginx服务器

1. 安装nginx依赖 首先安装nginx的依赖 yum install gcc gcc-c openssl openssl-devel cyrus-sasl-md5 2,创建nginx用户 如果没有nginx,启动nginx时会报错 [rootlocalhost nginx-1.11.2]# /usr/local/nginx/sbin/nginx nginx: [emerg] getpwnam("ng…

2017-2018-2 20179215《网络攻防实践》第六周作业

2017-2018-2 20179215《网络攻防实践》 第六周学习总结 课本学习笔记 一、TCP/IP网络协议攻击 1.网络安全的属性:机密性 、完整性 、可用性 、真实性 、不可抵赖性 。 2.网络攻击的基本模式分为:截获(嗅探 与 监听) 、中断&#x…

mysql分布式一致性hash_分布式哈希一致性

问题分布式哈希一致性的动机是什么?相比其他有什么好处概述我们谈论的分布式哈希一致性常常使用在负载均衡,权衡一个策略的好坏,我们常常谈到扩展性和容错性。我们可以从以下两个方面来考量扩展性 :水平扩展和垂直扩展&#xff0c…

css3 - target

通过CSS3伪元素target&#xff0c;我们可以实现拉风琴 源码 1 <!DOCTYPE HTML>2 <html lang"en-US">3 4 <head>5 <meta charset"UTF-8">6 <title>垂直手风琴</title>7 <style type"text/css"…

javascript中打印对象显示[object object]_js如何打印object对象

这篇文章主要介绍了js如何打印object对象,需要的朋友可以参考下 js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来…

弹弹堂sf发布网_私服冒险岛,新开私服冒险岛,心动sf冒险岛发布网,最新开的私服冒险岛应该如何快速的获取魅力呢?...

私服冒险岛,新开私服冒险岛,心动sf冒险岛发布网,最新开的私服冒险岛应该如何快速的获取魅力呢&#xff1f;不同的游戏&#xff0c;我们在操作的时候&#xff0c;最主要的一点就是想要去涨经验&#xff0c;只有通过经验的积累才可以快速的升级&#xff0c;才可以进入到更多的地图…

svm解决兵王问题_机器学习: svm

本周学习内容为SVM的基本原理和运用。参考资料&#xff1a;耳东陈&#xff1a;零基础学SVM—Support Vector Machine(一)1、什么是SVMSVM的全称是Support Vector Machine&#xff0c;即支持向量机&#xff0c;主要用于解决模式识别领域中的数据分类问题&#xff0c;属于有监督学…

Django基础11(Django中form表单)

Form介绍 之前在HTML页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如校验用户是否输入&#xff0c;输入的长度和格式等正不正确。如果用户输入的…

mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念&#xff0c;有了核心概念整个骨架就完整了&#xff0c;应付无状态程序已经够了&#xff0c;但还不够丰满。应用程序分成两种&#xff0c;无状态和有状态的。一般的前段和后端程序都是无状态的&a…

python简单笔记

Remarks&#xff1a;python中注意缩进&#xff08;Tab键或者4个空格&#xff09; print&#xff08;输出&#xff09; 格式&#xff1a;print&#xff08;values&#xff09; 字符串、数字、变量等都可以输出&#xff1a; 实例&#xff1a; print(1)->1 print(11)->2 a …

【Alpha阶段】第一次Scrum Meeting

PS&#xff1a;因为安装android的SDK插件出现问题&#xff0c;在eclipse和android studio中安装都不成功&#xff0c;项目不能运行&#xff0c;且一直在下载一些插件&#xff0c;安装了3天都没有成功&#xff0c;按照网上的解决办法进行解决都没有成功&#xff0c;导致项目不能…

581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况

&#xff3b;抄题&#xff3d;&#xff1a; Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too. You need to find the shortest suc…

python三阶魔方_三阶魔方自动求解及动态可视化matlab代码

三阶魔方自动求解及动态可视化matlab代码思路与步骤三阶魔方有6个面&#xff0c;每个面有333\times333小块&#xff0c;用一个6336\times3\times3633的矩阵来保存魔方的状态&#xff1b;定义412种魔方旋转行为&#xff1a;整体旋转(左右上下共4种方式AaCc)&#xff0c;侧面(6个…

Qt 常用类——QStandardItemModel

转载&#xff1a;落叶知秋时 类QabstractItemModel&#xff0c;QabstractListModel&#xff0c;QAbstractTableModel不保存数据&#xff0c;用户需要从这些类派生出子类&#xff0c;并在子类中定义某种数据结构来保存数据。 与此不同&#xff0c;类QStandardItemModel负责保存数…