Веб-страница «Разработка» для отображения моделей глубокого обучения | Учебник по началу работы с Gradio

искусственный интеллект глубокое обучение

Установить

Градио потребностиPython 3. Если у вас есть Python, вы можете скачатьgradioИспользуйте последнюю версию pip следующим образом:

pip install gradio

или,pip3 install gradioЭто может потребоваться, если у вас несколько установок Python.

Основное использование

Чтобы создать интерфейс с помощью gradio, достаточно добавить несколько строк в существующий код. Например, следующееgradioИспользовать предварительную подготовкуkerasМетод интерфейса создания модели:

import gradio, tensorflow as tf
image_mdl = tf.keras.applications.inception_v3.InceptionV3()
io = gradio.Interface(inputs="imageupload", outputs="label", model_type="keras", model=image_mdl)
io.launch()

Запуск приведенного выше кода откроет новое окно браузера с загруженным изображением. Пользователи могут перетаскивать свои собственные изображения, что приводит к следующему результату:

 

 

Основные параметры

Запуск интерфейса GradIO требует создания объекта, который принимает в качестве входного параметра: - строку, представляющую используемый интерфейс ввода или другие пользовательские подклассы (см.ниже). - Строка, представляющая используемый выходной интерфейс или другие пользовательские подклассы (см.ниже). - Строка, представляющая входящий тип модели. Поддерживаемые типы включают keras. - Актуальная модель для обработки.Interface(inputs : str, outputs : str, model_type : str, model : Any)
inputs``gradio.AbstractInput
outputs``gradio.AbstractOutput
model_type
model

Объекты, представляющие входные и выходные интерфейсы, могут быть предоставлены вместоinputsи укажите имя строкиoutputs. Например, код в разделе «Основное использование» выполняется следующим образом:

import gradio, tensorflow as tf
image_mdl = tf.keras.applications.inception_v3.InceptionV3()
inp = gradio.inputs.ImageUpload()
out = gradio.outputs.Label()
io = gradio.Interface(inputs=inp, outputs=out, model_type="keras", model=mdl)
io.launch()

Это позволяет настраивать интерфейс, передавая параметры в конструкторы ввода и вывода. Параметры, принимаемые каждым конструктором интерфейса, описаны ниже.

Поддерживаемые интерфейсы

Вот список поддерживаемых в настоящее время интерфейсов в GradIO. Все входы могут быть сопряжены с любым выходом.

входной интерфейс

inputs=“text”

Используйте этот интерфейс для ввода текста в качестве входных данных. параметр:никто

входить

 

inputs=“imageupload”

Используйте этот интерфейс для загрузки изображений в модель. параметр:
shape- Кортеж, форма которого должна изменять размер загруженного изображения перед передачей в модель. По умолчанию:(224, 224, 3)
image_mode- Режим изображения PIL для преобразования изображений в массивы numpy. Обычно «RGB» (3-канальный RGB) или «L» (1-канальный в оттенках серого). По умолчанию:'RGB'
scale- Число с плавающей запятой, используемое для изменения масштаба каждого значения пикселя в изображении. По умолчанию:1/127.5
shift- Число с плавающей запятой, используемое для сдвига значения каждого пикселя в изображении после масштабирования. По умолчанию:-1
cropper_aspect_ratio- None или float — соотношение сторон обрезки. дефолт:None

входить

удалить изображение здесь
- или -
Нажмите, чтобы загрузить

inputs=“snapshot”

Используйте этот интерфейс, чтобы делать снимки с веб-камеры пользователя. параметр:
shape- Кортеж, форма которого должна изменять размер загруженного изображения перед передачей в модель. По умолчанию:(224, 224, 3)
image_mode- Режим изображения PIL для преобразования изображений в массивы numpy. Обычно «RGB» (3-канальный RGB) или «L» (1-канальный в оттенках серого). По умолчанию:'RGB'
scale- Число с плавающей запятой, используемое для изменения масштаба каждого значения пикселя в изображении. По умолчанию:1/127.5
shift- Число с плавающей запятой, используемое для сдвига значения каждого пикселя в изображении после масштабирования. По умолчанию:-1
cropper_aspect_ratio- None или float — соотношение сторон обрезки. дефолт:None

входить

Нажмите, чтобы загрузить снимок с веб-камеры.

inputs=“sketchpad”

Используйте этот интерфейс, чтобы принимать простые монохромные изображения в качестве входных данных. параметр:
shape- Кортеж, форма которого должна изменять размер загруженного изображения перед передачей в модель. По умолчанию:(224, 224, 3)
invert_colors- Логическое значение, указывающее, следует ли инвертировать цвета перед передачей в модель. дефолт:True

входить

inputs=“microphone”

Используйте этот разъем для аудиовхода микрофона.

входить

Нажмите, чтобы загрузить звук с микрофона.

inputs=“audio_file”

Используйте этот интерфейс для загрузки аудио в модель.

входить

удалить аудиофайлы здесь
- или -
Нажмите, чтобы загрузить

Выходной интерфейс

outputs=“classifier”

Используйте этот интерфейс для классификации. Отвечайте с доверительными интервалами.

Урожай

счастье

счастье

73%

Удивляться

20%

грустный


злость


outputs=“text”

Используйте этот интерфейс для отображения выходного текста.

Урожай

 

outputs=“image”

Используйте этот интерфейс для отображения выходного текста.

Урожай

настраиваемый интерфейс

На практике пользовательские входные и выходные интерфейсы довольно типичны, поэтому они предварительно обрабатывают входные данные таким образом, который принимает модель, или соответствующим образом постобрабатывают результаты модели, чтобы интерфейс вывода мог отображать результаты. Например, вам может потребоваться настроить предварительную обработку интерфейса загрузки изображения, чтобы изменить размер изображения до правильных размеров, прежде чем загружать его в модель. Это можно сделать одним из двух способов: (1) Создать экземпляр с пользовательскими параметрами.gradio.Inputgradio.Outputобъекта или (2) предоставить пользовательские функции предварительной/постобработки.

Объекты ввода/вывода с пользовательскими параметрами

Для небольших общих изменений интерфейсов ввода и вывода обычно можно просто изменить параметры в конструкторах объектов ввода и вывода, чтобы повлиять на предварительную/постобработку. Вот пример изменения размера изображения до другого размера перед его подачей в модель и настройки выходного интерфейса, чтобы скрыть доверительную зону и показать 5 лучших классов вместо 3 по умолчанию:

import gradio, tensorflow as tf
image_mdl = tf.keras.applications.inception_v3.InceptionV3()
inp = gradio.inputs.ImageUpload(shape=(299, 299, 3))
out = gradio.outputs.Label(num_top_classes=5)
io = gradio.Interface(inputs=inp, outputs=out, model_type="keras", model=mdl)
io.launch()

Пользовательские функции предварительной/постобработки

Кроме того, вы можете полностью переопределить функции предварительной/постобработки по умолчанию, предоставив свои собственные функции. Например, здесь мы модифицируем функцию предварительной обработки интерфейса ImageUpload, чтобы добавить немного шума к изображению, прежде чем передать его в модель.

import gradio, base64, numpy as np, tensorflow as tf
from io import BytesIO
from PIL import Image
image_mdl = tf.keras.applications.inception_v3.InceptionV3()

def pre(inp):
    im = gradio.preprocessing_utils.encoding_to_image(inp)
    im = gradio.preprocessing_utils.resize_and_crop(im, (299, 299))
    im = np.array(im).flatten()
    im = im * 1/127.5 - 1
    im = im + np.random.normal(0, 0.1, im.shape)   # Adding the noise
    array = im.reshape(1, 299, 299, 3)
    return array

inp = gradio.inputs.ImageUpload(preprocessing_fn=pre)
io = gradio.Interface(inputs=inp, outputs="label", model_type="keras", model=mdl)
io.launch()

Тип модели

В настоящее время мы поддерживаем следующие модели:

model_type="sklearn"

Это позволяет вам передать модель scikit-learn и получить прогнозы от модели. это тренировкаsklearnмодель иgradioПолный пример создания интерфейса вокруг него.

from sklearn import datasets, svm
import gradio

digits = datasets.load_digits()
n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))   # flatten the images

 # Create a classifier: a support vector classifier
classifier = svm.SVC(gamma=0.001)
classifier.fit(data, digits.target)

 # The sklearn digits dataset is different from MNIST: it is 8x8 and consists of black digits on a white background. 
inp = gradio.inputs.Sketchpad(shape=(8, 8), flatten=True, scale=16/255, invert_colors=False)
io = gradio.Interface(inputs=inp, outputs="label", model_type="sklearn", model=classifier)
io.launch()

model_type="keras"

Это позволяет вам передавать модель keras и получать прогнозы от модели. это тренировкаkerasмодель иgradioПолный пример создания интерфейса вокруг него.

import gradio, tensorflow as tf

(x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
loss, accuracy = model.evaluate(x_test, y_test)

io = gradio.Interface(inputs="sketchpad", outputs="label", model=model, model_type='keras')
io.launch(inline=True, share=True)

Запустив этот код в блокноте colab,чтобы увидеть встроенный в ноутбук интерфейс.

model_type="pytorch"

Это позволяет вам передавать модель pytorch и получать прогнозы от модели. это тренировкаpytorchмодель иgradioПолный пример создания интерфейса вокруг него.

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import gradio

 # Device configuration
device = torch.device('cpu')

 # Hyper-parameters
input_size = 784
hidden_size = 500
num_classes = 10
num_epochs = 2
batch_size = 100
learning_rate = 0.001

 # MNIST dataset
train_dataset = torchvision.datasets.MNIST(root='../../data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='../../data',train=False, transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size,shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

 # Fully connected neural network with one hidden layer
class NeuralNet(nn.Module):
    def  __init__ (self, input_size, hidden_size, num_classes):
        super(NeuralNet, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        out = self.fc1(x)
        out = self.relu(out)
        out = self.fc2(out)
        return out

model = NeuralNet(input_size, hidden_size, num_classes).to(device)

 # Loss and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

 # Train the model
total_step = len(train_loader)
for epoch in range(num_epochs):
    for i, (images, labels) in enumerate(train_loader):
         # Move tensors to the configured device
        images = images.reshape(-1, 28*28).to(device)
        labels = labels.to(device)

         # Forward pass
        outputs = model(images)
        loss = criterion(outputs, labels)

         # Backward and optimize
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

inp = gradio.inputs.Sketchpad(flatten=True, scale=1/255, dtype='float32')
io = gradio.Interface(inputs=inp, outputs="label", model_type="pytorch", model=model)
io.launch()
        

model_type="pyfunc"

Это позволяет вам передавать произвольные функции Python и получать результат от функции. это сgradioОчень простой пример «модели» интерфейса.

import gradio

 # A very simplistic function that capitalizes each letter in the given string
def big(x):
    return x.upper()

io = gradio.Interface(inputs="textbox", outputs="textbox", model=big, model_type='pyfunc')
io.launch(inline=True, share=True)

pyfuncБолее реалистичным примером варианта использования может быть следующий, когда мы хотим использовать сеанс TensorFlow с обученной моделью для прогнозирования. Итак, мы оборачиваем сеанс в функцию Python следующим образом:

import tensorflow as tf
import gradio

n_classes = 10
(x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train.reshape(-1, 784) / 255.0, x_test.reshape(-1, 784) / 255.0
y_train = tf.keras.utils.to_categorical(y_train, n_classes).astype(float)
y_test = tf.keras.utils.to_categorical(y_test, n_classes).astype(float)

learning_rate = 0.5
epochs = 5
batch_size = 100

x = tf.placeholder(tf.float32, [None, 784], name="x")
y = tf.placeholder(tf.float32, [None, 10], name="y")

W1 = tf.Variable(tf.random_normal([784, 300], stddev=0.03), name='W1')
b1 = tf.Variable(tf.random_normal([300]), name='b1')
W2 = tf.Variable(tf.random_normal([300, 10], stddev=0.03), name='W2')
hidden_out = tf.add(tf.matmul(x, W1), b1)
hidden_out = tf.nn.relu(hidden_out)
y_ = tf.matmul(hidden_out, W2)

probs = tf.nn.softmax(y_)
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_, labels=y))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cross_entropy)
init_op = tf.global_variables_initializer()
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

sess = tf.Session()
sess.run(init_op)
total_batch = int(len(y_train) / batch_size)
for epoch in range(epochs):
    avg_cost = 0
    for start, end in zip(range(0, len(y_train), batch_size), range(batch_size, len(y_train)+1, batch_size)):
        batch_x = x_train[start: end]
        batch_y = y_train[start: end]
        _, c = sess.run([optimizer, cross_entropy], feed_dict={x: batch_x, y: batch_y})
        avg_cost += c / total_batch

def predict(inp):
    return sess.run(probs, feed_dict={x:inp})

inp = gradio.inputs.Sketchpad(flatten=True)
io = gradio.Interface(inputs=inp, outputs="label", model_type="pyfunc", model=predict)
io.launch(inline=True, share=True)

карта значимости

ДолженimageuploadИнтерфейс также поддерживает модели значимости, в которых тепловая карта накладывается поверх входного изображения. Это можно использовать для отображения свойств объекта, например, в качестве метода объяснения. Пользователи предоставляют свою собственную функцию значимости, которая должна принимать три параметра: объект модели, входные функции и входные метки. Вот пример функции значимости и того, что она может дать:

import numpy as np
import tensorflow as tf
from deepexplain.tensorflow import DeepExplain
from tensorflow.keras import backend as K
from tensorflow.keras.models import Sequential, Model
import gradio

model = tf.keras.applications.MobileNet()

def saliency(model, x, y):
    y = y.reshape(1, 1, 1, 1000)
    with DeepExplain(session=K.get_session()) as de:
        input_tensor = model.layers[0].input
        fModel = Model(inputs=input_tensor, outputs = model.layers[-3].output)
        target_tensor = fModel(input_tensor)

        attributions_gradin = de.explain('grad*input', target_tensor, input_tensor, x, ys=y)
        sal = np.sum(np.abs(attributions_gradin.squeeze()), axis=-1)
        sal = (sal - sal.min()) / (sal.max() - sal.min())
        return sal

inp = gradio.inputs.ImageUpload()
out = gradio.outputs.Label(label_names='imagenet1000', max_label_words=1, word_delimiter=",")

io = gradio.Interface(inputs=inp,
                      outputs=out,
                      model=model,
                      model_type='keras',
                      saliency=saliency)

io.launch();

производит это:

параметры загрузки

При запуске интерфейса вы можете дополнительно передать несколько логических параметров, чтобы определить, как будет отображаться интерфейс. В следующем примере показаны все возможные параметры:

io.launch(inbrowser=True, inline=False, validate=False, share=True)

inbrowser- Должна ли модель запускаться в новом окне браузера.
inline- Должна ли модель быть встроена в интерактивную среду Python (например, блокноты jupyter или блокноты colab).
validate- Должен ли gradio проверять совместимость модели интерфейса перед запуском.
share- Должны ли создаваться общедоступные ссылки на общие модели. для обработки.