溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

發(fā)布時(shí)間:2021-11-18 17:07:47 來源:億速云 閱讀:105 作者:柒染 欄目:大數(shù)據(jù)

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。


構(gòu)建一個(gè)很棒的機(jī)器學(xué)習(xí)項(xiàng)目是一回事,但歸根結(jié)底,你希望其他人能夠看到你的辛勤工作。當(dāng)然,你可以將整個(gè)項(xiàng)目放在GitHub上,但是怎么讓你的祖父母也看到呢?我們想要的是將深度學(xué)習(xí)模型部署為世界上任何人都可以訪問的Web應(yīng)用程序。

在本文中,我們將看到如何編寫一個(gè)Web應(yīng)用程序,該應(yīng)用程序使用經(jīng)過訓(xùn)練的Keras遞歸神經(jīng)網(wǎng)絡(luò),并允許用戶生成新的專利文摘。這個(gè)項(xiàng)目建立在遞歸神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)上,但是了解如何創(chuàng)建RNN是不必要的。

現(xiàn)在我們將其視為黑匣子:我們按一個(gè)開始的順序進(jìn)行操作,它輸出一個(gè)全新的專利文摘,可以在瀏覽器中顯示!

傳統(tǒng)上,數(shù)據(jù)科學(xué)家會(huì)開發(fā)模型,而前端工程師則將模型展示給全世界。在這個(gè)項(xiàng)目中,我們必須扮演兩個(gè)角色,并投入到Web開發(fā)中(盡管幾乎全部使用Python)。

該項(xiàng)目需要將眾多主題結(jié)合在一起:

  • Flask:用Python創(chuàng)建一個(gè)基本的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é)果是一個(gè)網(wǎng)絡(luò)應(yīng)用程序,該應(yīng)用程序允許用戶使用經(jīng)過訓(xùn)練的循環(huán)神經(jīng)網(wǎng)絡(luò)生成全新的專利文摘:

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

該項(xiàng)目的完整代碼可在GitHub上找到。

  • https://github.com/WillKoehrsen/recurrent-neural-networks

方法

目的是使Web應(yīng)用程序盡快啟動(dòng)并運(yùn)行。為此,我選擇了Flask,它允許我們用Python編寫應(yīng)用程序。我不喜歡搞亂樣式(這清楚地顯示了),所以幾乎所有的CSS都是復(fù)制和粘貼的。

Keras團(tuán)隊(duì)的這篇文章(https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html) 對基礎(chǔ)知識(shí)很有幫助,本文也是一個(gè)有用的指南。

總體而言,該項(xiàng)目遵循我的設(shè)計(jì)原則:快速啟動(dòng)并運(yùn)行原型——根據(jù)需要進(jìn)行復(fù)制和粘貼,然后進(jìn)行迭代以制作出更好的產(chǎn)品。

帶Flask的基本W(wǎng)eb應(yīng)用程序

用Python構(gòu)建Web應(yīng)用程序的最快方法是使用Flask。要制作自己的應(yīng)用程序,我們可以使用以下內(nèi)容:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h2>Not Much Going On Here</h2>"

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

如果你復(fù)制并粘貼此代碼并運(yùn)行它,則可以在 localhost:50000上查看自己的Web應(yīng)用程序。當(dāng)然,我們還想做更多的事情,所以我們將使用稍微復(fù)雜一點(diǎn)的功能,該功能基本上可以完成相同的工作:處理來自瀏覽器的請求,并以HTML形式提供一些內(nèi)容。對于我們的主頁,我們想向用戶顯示一個(gè)表單以輸入一些詳細(xì)信息。

用戶輸入表

當(dāng)用戶到達(dá)應(yīng)用程序的主頁時(shí),我們將向他們顯示一個(gè)帶有三個(gè)參數(shù)的表單供你選擇:

  1. 輸入RNN的開始序列或隨機(jī)選擇

  2. 選擇RNN預(yù)測的多樣性

  3. 選擇RNN輸出的字?jǐn)?shù)

要在Python中構(gòu)建表單,我們將使用wtforms。創(chuàng)建表單的代碼為:

  • 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")

這將創(chuàng)建如下所示的表單(樣式來自main.css):

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

validator代碼確保用戶輸入正確的信息。例如,我們檢查所有框是否都已填寫,且其diversity介于0.5到5之間。必須滿足這些條件才能接受該表格。

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

我們Flask實(shí)際提供表單的方式是使用模板。

模板

模板是一個(gè)包含基本框架的文檔,我們需要用它來填充細(xì)節(jié)。對于Flask Web應(yīng)用程序,我們可以使用Jinja模板庫將Python代碼傳遞到HTML文檔。例如,在main函數(shù)中,我們將把表單的內(nèi)容發(fā)送到一個(gè)名為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)

當(dāng)用戶到達(dá)主頁時(shí),我們的應(yīng)用程序?qū)⑻峁?code>index.html表格上的細(xì)節(jié)。該模板是一個(gè)簡單的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>

對于表單中的每個(gè)錯(cuò)誤(那些無法驗(yàn)證的條目),對應(yīng)的一個(gè)錯(cuò)誤將閃爍。除此之外,此文件將顯示上述表單。

當(dāng)用戶輸入信息并點(diǎn)擊submit(POST請求)時(shí),如果信息是正確的,我們希望將輸入轉(zhuǎn)移到適當(dāng)?shù)暮瘮?shù),以使用經(jīng)過訓(xùn)練的RNN進(jìn)行預(yù)測。這意味著修改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)

現(xiàn)在,當(dāng)用戶點(diǎn)擊submit并且信息正確時(shí),根據(jù)輸入的不同,輸入將被發(fā)送到generate_random_startgenerate_from_seed。這些函數(shù)使用經(jīng)過訓(xùn)練的Keras模型生成具有用戶指定的diversitynum_words的新穎專利。這些函數(shù)的輸出依次被發(fā)送到其中一個(gè)模板random.html或者seeded.html作為一個(gè)網(wǎng)頁。

使用預(yù)先訓(xùn)練的Keras模型進(jìn)行預(yù)測

模型參數(shù)是經(jīng)過訓(xùn)練的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()是基于這個(gè)要點(diǎn)的一種解決方案。

我將不展示這兩個(gè)util函數(shù)的全部內(nèi)容(這里是代碼),你需要理解的是它們使用經(jīng)過訓(xùn)練的Keras模型以及參數(shù),并對新的專利文摘進(jìn)行預(yù)測。

這些函數(shù)都返回帶有格式化HTML的Python字符串。該字符串被發(fā)送到另一個(gè)模板以呈現(xiàn)為網(wǎng)頁。例如,generate_random_start返回格式為html,返回結(jié)果為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。因?yàn)镻ython字符串已經(jīng)被格式化為HTML,我們所要做的就是使用{{input| safe}}(其中input是Python變量)來顯示它。然后我們就可以在main.css設(shè)計(jì)這個(gè)頁面的樣式了, 和其他html模板一樣。

輸出量

generate_random_start選擇一個(gè)隨機(jī)的專利文摘作為開始序列,并根據(jù)該摘要進(jìn)行預(yù)測。然后顯示開始順序,RNN生成的輸出和實(shí)際輸出:

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

該函數(shù)generate_from_seed采用用戶提供的起始序列,然后使用經(jīng)過訓(xùn)練的RNN對其進(jìn)行構(gòu)建。輸出如下:

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

盡管結(jié)果并不總是完全正確,但它們確實(shí)表明遞歸神經(jīng)網(wǎng)絡(luò)已經(jīng)學(xué)習(xí)了英語的基礎(chǔ)知識(shí)。經(jīng)過訓(xùn)練,可以預(yù)測前50個(gè)單詞中的下一個(gè)單詞,并掌握了如何撰寫具有說服力的專利文摘!

根據(jù)預(yù)測的多樣性,輸出可能是完全隨機(jī)的或循環(huán)的。

運(yùn)行應(yīng)用

要自己運(yùn)行該應(yīng)用程序,你所需要做的就是下載存儲(chǔ)庫,導(dǎo)航到該deployment目錄并輸入python run_keras_server.py。這將立即使Web應(yīng)用程序在localhost:10000可用。

根據(jù)家庭WiFi的配置方式,你應(yīng)該能夠使用IP地址從網(wǎng)絡(luò)上的任何計(jì)算機(jī)訪問該應(yīng)用程序。

下一步

你的個(gè)人計(jì)算機(jī)上運(yùn)行的Web應(yīng)用程序非常適合與朋友和家人共享。我絕對不建議你向家庭網(wǎng)絡(luò)中的所有人開放此功能!為此,我們想要在AWS EC2實(shí)例上設(shè)置應(yīng)用程序并將其提供給全世界(稍后發(fā)布)。

為了改善應(yīng)用程序,我們可以(通過main.css)更改樣式,并可能添加更多選項(xiàng),例如選擇經(jīng)過預(yù)先訓(xùn)練的網(wǎng)絡(luò)的功能。關(guān)于個(gè)人項(xiàng)目的偉大之處在于,你可以根據(jù)需要擴(kuò)展它們。如果你想使用該應(yīng)用程序,請下載代碼并開始使用。

  • 代碼下載:https://github.com/WillKoehrsen/recurrent-neural-networks

用Python將Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序的示例分析

在本文中,我們看到了如何將訓(xùn)練有素的Keras深度學(xué)習(xí)模型部署為Web應(yīng)用程序。這需要將多種不同的技術(shù)結(jié)合在一起,包括遞歸神經(jīng)網(wǎng)絡(luò),Web應(yīng)用程序,模板,HTML,CSS,當(dāng)然還有Python。

雖然這只是一個(gè)基本的應(yīng)用程序,但它表明你可以開始使用深度學(xué)習(xí)來構(gòu)建web應(yīng)用程序,而不需要花費(fèi)太多的精力。

submit = SubmitField("Enter")

在訓(xùn)練模型中加載。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI