Развертывание моделей глубокого обучения Keras в качестве веб-приложений с помощью Python

машинное обучение глубокое обучение компьютерное зрение NLP

Автор | Уилл Кёрсен Компиляция|Флин Источник|наука о данных

Создание отличного проекта машинного обучения — это одно, но, в конце концов, вы хотите, чтобы другие люди видели вашу тяжелую работу. Конечно, вы можете выложить весь проект на GitHub, но как сделать так, чтобы ваши бабушки и дедушки тоже его увидели? Мы хотим развернуть модель глубокого обучения в виде веб-приложения, к которому может получить доступ любой человек в мире.

В этой статье мы увидим, как написать веб-приложение, которое использует обученную рекуррентную нейронную сеть Keras и позволяет пользователям создавать новые рефераты патентов. Этот проект основан на рекуррентных нейронных сетях, но понимание того, как создавать RNN, не обязательно.

Теперь мы рассматриваем его как черный ящик: мы делаем это в начальном порядке, и он выводит совершенно новый реферат патента, который можно отобразить в браузере!

Традиционно специалисты по данным разрабатывают модели, а фронтенд-инженеры представляют модели миру. В этом проекте нам пришлось сыграть две роли и погрузиться в веб-разработку (хотя и почти полностью на Python).

Проект должен был объединить множество тем:

  • Flask: создание простого веб-приложения на Python

  • Keras: развертывание обученных рекуррентных нейронных сетей

  • Создавайте шаблоны с помощью библиотеки шаблонов Jinja.

  • HTML и CSS для написания веб-страниц

  • Колба:flask.pocoo.org/

  • Керас:keras.io/

  • HTML:www.w3schools.com/html/

  • CSS:Я 3schools.com/HTML/HTML_ из…

Конечным результатом является веб-приложение, которое позволяет пользователям создавать совершенно новые рефераты патентов с помощью обученной рекуррентной нейронной сети:

Полный код этого проекта доступен на GitHub.

метод

Цель состоит в том, чтобы запустить веб-приложение как можно быстрее. Для этого я выбрал Flask, который позволяет нам писать приложения на Python. Я не люблю возиться со стилями (это ясно видно), поэтому практически весь CSS копируется и вставляется.

Эта статья от команды Keras (блог RAS.IO/building-ah-…Отлично подходит для основ, эта статья также является полезным руководством.

В целом, проект следует моим принципам проектирования: быстро создать и запустить прототип — скопировать и вставить по мере необходимости, а затем итерировать, чтобы сделать продукт лучше.

Базовое веб-приложение с Flask

Самый быстрый способ создавать веб-приложения на Python — использовать 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)

Если вы скопируете и вставите этот код и запустите его, вы сможете просмотреть свое веб-приложение на локальном хосте: 50000. Конечно, мы хотим сделать еще больше, поэтому мы собираемся использовать немного более сложную функцию, которая в основном выполняет ту же работу: обрабатывает запрос от браузера и предоставляет некоторый контент в HTML. Для нашей домашней страницы мы хотим показать пользователю форму для ввода некоторых данных.

форма ввода пользователя

Когда пользователь попадает на главную страницу приложения, мы показываем ему форму с тремя параметрами на выбор:

  1. Введите начальную последовательность RNN или выберите случайным образом
  2. Выбор разнообразия прогнозов RNN
  3. Выберите количество слов, выводимых RNN

Чтобы построить форму на Python, мы будем использовать wtforms. Код для создания формы:

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Код гарантирует, что пользователь вводит правильную информацию. Например, мы проверяем, что все поля заполнены и их разнообразие находится в пределах от 0,5 до 5. Эти условия должны быть выполнены, чтобы принять форму.

На самом деле мы обслуживаем формы в Flask с помощью шаблонов.

шаблон

Шаблон — это документ, который содержит базовый скелет, необходимый нам для заполнения деталей. Для веб-приложений Flask мы можем использовать библиотеку шаблонов Jinja для передачи кода Python в документы HTML. Например, в основной функции мы отправим содержимое формы в файл с именем index.html.

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">
    <h1>
      <center>Writing Novel Patent Abstracts with Recurrent Neural Networks</center>
    </h1>

    {% 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)

Теперь, когда пользователь нажимает «Отправить» и информация верна, в зависимости от ввода, ввод будет отправлен на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.h5')
    # Required for model to work
    global graph
    graph = tf.get_default_graph()
    
load_keras_model()

tf.get_default_graph()это решение, основанное на этой точке.

Я не буду показывать полное содержание этих двух полезных функций (вот код), вам нужно понять, что они используют обученную модель Keras с параметрами и делают прогнозы для новых тезисов патентов.

Все эти функции возвращают строки Python с отформатированным HTML. Эта строка отправляется в другой шаблон для отображения в виде веб-страницы. Например,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. Это немедленно сделает веб-приложение доступным по адресу localhost:10000.

В зависимости от того, как настроен ваш домашний Wi-Fi, вы сможете получить доступ к приложению с любого компьютера в сети, используя его IP-адрес.

Следующий шаг

Веб-приложения, работающие на вашем персональном компьютере, отлично подходят для обмена с друзьями и семьей. Я определенно не рекомендую вам открывать эту функцию для всех в вашей домашней сети! Для этого мы хотим настроить приложение на инстансах AWS EC2 и сделать его доступным для всего мира (будет выпущено позже).

Чтобы улучшить приложение, мы можем изменить стили (через main.css) и, возможно, добавить дополнительные параметры, такие как возможность выбора предварительно обученной сети. Самое замечательное в личных проектах то, что вы можете расширять их по мере необходимости. Если вы хотите использовать приложение, загрузите код и приступайте к работе.

в заключении

В этой статье мы увидели, как развернуть обученную модель глубокого обучения Keras в виде веб-приложения. Это требует объединения ряда различных технологий, включая рекуррентные нейронные сети, веб-приложения, шаблоны, HTML, CSS и, конечно же, Python.

Хотя это всего лишь базовое приложение, оно показывает, что вы можете начать создавать веб-приложения с использованием глубокого обучения без особых усилий.

submit = SubmitField("Enter")

Загрузите обученную модель.

Оригинальная ссылка:к data science.com/stop - я все еще получаю…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/