为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...
構(gòu)建一個很棒的機器學(xué)習(xí)項目是一回事,但歸根結(jié)底,你希望其他人能夠看到你的辛勤工作。當(dāng)然,你可以將整個項目放在GitHub上,但是怎么讓你的祖父母也看到呢?我們想要的是將深度學(xué)習(xí)模型部署為世界上任何人都可以訪問的Web應(yīng)用程序。
在本文中,我們將看到如何編寫一個Web應(yīng)用程序,該應(yīng)用程序使用經(jīng)過訓(xùn)練的Keras遞歸神經(jīng)網(wǎng)絡(luò),并允許用戶生成新的專利文摘。這個項目建立在遞歸神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,但是了解如何創(chuàng)建RNN是不必要的。
現(xiàn)在我們將其視為黑匣子:我們按一個開始的順序進行操作,它輸出一個全新的專利文摘,可以在瀏覽器中顯示!
傳統(tǒng)上,數(shù)據(jù)科學(xué)家會開發(fā)模型,而前端工程師則將模型展示給全世界。在這個項目中,我們必須扮演兩個角色,并投入到Web開發(fā)中(盡管幾乎全部使用Python)。
該項目需要將眾多主題結(jié)合在一起:
- Flask:用Python創(chuàng)建一個基本的Web應(yīng)用程序
- Keras:部署訓(xùn)練有素的遞歸神經(jīng)網(wǎng)絡(luò)
- 使用Jinja模板庫創(chuàng)建模板
- 用于編寫網(wǎng)頁的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
最終結(jié)果是一個網(wǎng)絡(luò)應(yīng)用程序,該應(yīng)用程序允許用戶使用經(jīng)過訓(xùn)練的循環(huán)神經(jīng)網(wǎng)絡(luò)生成全新的專利文摘:
該項目的完整代碼可在GitHub上找到。
- https://github.com/WillKoehrsen/recurrent-neural-networks
方法
目的是使Web應(yīng)用程序盡快啟動并運行。為此,我選擇了Flask,它允許我們用Python編寫應(yīng)用程序。我不喜歡搞亂樣式(這清楚地顯示了),所以幾乎所有的CSS都是復(fù)制和粘貼的。
Keras團隊的這篇文章(https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html) 對基礎(chǔ)知識很有幫助,本文也是一個有用的指南。
總體而言,該項目遵循我的設(shè)計原則:快速啟動并運行原型——根據(jù)需要進行復(fù)制和粘貼,然后進行迭代以制作出更好的產(chǎn)品。
帶Flask的基本W(wǎng)eb應(yīng)用程序
用Python構(gòu)建Web應(yīng)用程序的最快方法是使用Flask。要制作自己的應(yīng)用程序,我們可以使用以下內(nèi)容:
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)如果你復(fù)制并粘貼此代碼并運行它,則可以在 localhost:50000上查看自己的Web應(yīng)用程序。當(dāng)然,我們還想做更多的事情,所以我們將使用稍微復(fù)雜一點的功能,該功能基本上可以完成相同的工作:處理來自瀏覽器的請求,并以HTML形式提供一些內(nèi)容。對于我們的主頁,我們想向用戶顯示一個表單以輸入一些詳細信息。
用戶輸入表
當(dāng)用戶到達應(yīng)用程序的主頁時,我們將向他們顯示一個帶有三個參數(shù)的表單供你選擇:
要在Python中構(gòu)建表單,我們將使用wtforms。創(chuàng)建表單的代碼為:
- wtforms:https://wtforms.readthedocs.io/
這將創(chuàng)建如下所示的表單(樣式來自main.css):
該validator代碼確保用戶輸入正確的信息。例如,我們檢查所有框是否都已填寫,且其diversity介于0.5到5之間。必須滿足這些條件才能接受該表格。
我們Flask實際提供表單的方式是使用模板。
模板
模板是一個包含基本框架的文檔,我們需要用它來填充細節(jié)。對于Flask Web應(yīng)用程序,我們可以使用Jinja模板庫將Python代碼傳遞到HTML文檔。例如,在main函數(shù)中,我們將把表單的內(nèi)容發(fā)送到一個名為index.html的文件.
- Jinja模板庫:http://jinja.pocoo.org/
當(dāng)用戶到達主頁時,我們的應(yīng)用程序?qū)⑻峁﹊ndex.html表格上的細節(jié)。該模板是一個簡單的html框架,我們在其中使用{{variable}}語法引用python變量。
RNN Patent WritingWriting 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 %}
對于表單中的每個錯誤(那些無法驗證的條目),對應(yīng)的一個錯誤將閃爍。除此之外,此文件將顯示上述表單。
當(dāng)用戶輸入信息并點擊submit(POST請求)時,如果信息是正確的,我們希望將輸入轉(zhuǎn)移到適當(dāng)?shù)暮瘮?shù),以使用經(jīng)過訓(xùn)練的RNN進行預(yù)測。這意味著修改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)現(xiàn)在,當(dāng)用戶點擊submit并且信息正確時,根據(jù)輸入的不同,輸入將被發(fā)送到generate_random_start或generate_from_seed。這些函數(shù)使用經(jīng)過訓(xùn)練的Keras模型生成具有用戶指定的diversity和num_words的新穎專利。這些函數(shù)的輸出依次被發(fā)送到其中一個模板random.html或者seeded.html作為一個網(wǎng)頁。
使用預(yù)先訓(xùn)練的Keras模型進行預(yù)測
模型參數(shù)是經(jīng)過訓(xùn)練的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函數(shù)的全部內(nèi)容(這里是代碼),你需要理解的是它們使用經(jīng)過訓(xùn)練的Keras模型以及參數(shù),并對新的專利文摘進行預(yù)測。
這些函數(shù)都返回帶有格式化HTML的Python字符串。該字符串被發(fā)送到另一個模板以呈現(xiàn)為網(wǎng)頁。例如,generate_random_start返回格式為html,返回結(jié)果為random.html:
Random Starting Abstract Home {% block content %} {{input|safe}} {% endblock %}這里我們再次使用Jinja模板引擎來顯示格式化的HTML。因為Python字符串已經(jīng)被格式化為HTML,我們所要做的就是使用{{input| safe}}(其中input是Python變量)來顯示它。然后我們就可以在main.css設(shè)計這個頁面的樣式了, 和其他html模板一樣。
輸出量
generate_random_start選擇一個隨機的專利文摘作為開始序列,并根據(jù)該摘要進行預(yù)測。然后顯示開始順序,RNN生成的輸出和實際輸出:
該函數(shù)generate_from_seed采用用戶提供的起始序列,然后使用經(jīng)過訓(xùn)練的RNN對其進行構(gòu)建。輸出如下:
盡管結(jié)果并不總是完全正確,但它們確實表明遞歸神經(jīng)網(wǎng)絡(luò)已經(jīng)學(xué)習(xí)了英語的基礎(chǔ)知識。經(jīng)過訓(xùn)練,可以預(yù)測前50個單詞中的下一個單詞,并掌握了如何撰寫具有說服力的專利文摘!
根據(jù)預(yù)測的多樣性,輸出可能是完全隨機的或循環(huán)的。
運行應(yīng)用
要自己運行該應(yīng)用程序,你所需要做的就是下載存儲庫,導(dǎo)航到該deployment目錄并輸入python run_keras_server.py。這將立即使Web應(yīng)用程序在localhost:10000可用。
根據(jù)家庭WiFi的配置方式,你應(yīng)該能夠使用IP地址從網(wǎng)絡(luò)上的任何計算機訪問該應(yīng)用程序。
下一步
你的個人計算機上運行的Web應(yīng)用程序非常適合與朋友和家人共享。我絕對不建議你向家庭網(wǎng)絡(luò)中的所有人開放此功能!為此,我們想要在AWS EC2實例上設(shè)置應(yīng)用程序并將其提供給全世界(稍后發(fā)布)。
為了改善應(yīng)用程序,我們可以(通過main.css)更改樣式,并可能添加更多選項,例如選擇經(jīng)過預(yù)先訓(xùn)練的網(wǎng)絡(luò)的功能。關(guān)于個人項目的偉大之處在于,你可以根據(jù)需要擴展它們。如果你想使用該應(yīng)用程序,請下載代碼并開始使用。
- 代碼下載:https://github.com/WillKoehrsen/recurrent-neural-networks
結(jié)論
在本文中,我們看到了如何將訓(xùn)練有素的Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序。這需要將多種不同的技術(shù)結(jié)合在一起,包括遞歸神經(jīng)網(wǎng)絡(luò),Web應(yīng)用程序,模板,HTML,CSS,當(dāng)然還有Python。
雖然這只是一個基本的應(yīng)用程序,但它表明你可以開始使用深度學(xué)習(xí)來構(gòu)建web應(yīng)用程序,而不需要花費太多的精力。
submit = SubmitField("Enter")在訓(xùn)練模型中加載。
總結(jié)
以上是生活随笔為你收集整理的为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据技术笔记之数据采集和预处理
- 下一篇: 基于Kubeadm的Flannel分析