Как подключить нейросеть к программе

Если вы являетесь аналитиком, вы можете не разбираться в архитектуре веб-приложений, поэтому позвольте мне сначала проиллюстрировать это. Извините, если это чрезмерное упрощение и человеческое объяснение! Но я видел достаточно «развертываний модели ML», которые на самом деле представляют собой просто XGBoost, обернутый во Flask, и знаю, что это настоящая проблема.

Пользователь (здесь слева) использует браузер, в котором работают только Javascript, HTML и CSS. Это фронтэнд. Он может совершать вызовы на внутренний сервер для получения результатов, которые он затем может обрабатывать и отображать. Бэкенд-сервер должен как можно скорее отвечать на запросы внешнего интерфейса; но серверной части может потребоваться взаимодействие с базами данных, сторонними API и микросервисами. Серверная часть также может создавать медленные задания, такие как задания машинного обучения, по запросу пользователя, которые он должен помещать в очередь. (Имейте в виду, что обычно пользователь должен как-то аутентифицировать себя).

ChatGPT: как работать с нейросетью и как зарегистрироваться в ChatGPT из России

Теперь давайте поговорим об архитектуре распределенного веб-приложения.

В общем, мы хотим запускать как можно больше серверных экземпляров для масштабируемости. Вот почему на диаграмме выше из «сервера» выходят пузырьки; они представляют «больше таких». Таким образом, каждый экземпляр должен оставаться без состояния: закончить обработку HTTP-запроса и выйти. Не храните ничего в памяти между запросами, потому что первый запрос клиента может быть отправлен на один сервер, а последующий запрос — на другой.

Плохо, если у нас есть долго работающая конечная точка: она свяжет один из наших серверов (скажем… выполнение какой-то задачи машинного обучения), оставив его неспособным обрабатывать запросы других пользователей. Нам нужно поддерживать отзывчивость веб-сервера и передавать ему длительные задачи с каким-то общим постоянством, чтобы, когда пользователь проверяет ход выполнения или запрашивает результат, любой сервер мог сообщить об этом. Кроме того, работы и их части должны выполняться параллельно таким количеством workers, на которое есть ресурсы.

Ответ — очередь «первым пришел — первым вышел» (FIFO). Серверная часть просто ставит задания в очередь. Workers выбирают и обрабатывают задания из очереди, выполняя обучение или логические выводы и сохраняя модели или прогнозы в базе данных по завершении.

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

Архитектура для настоящего развертывания модели машинного обучения такова:

Бэкенд-сервер получает запрос от веб-браузера пользователя. Он завернут в JSON, но семантически будет примерно таким: «Завтра среда, и сегодня мы продали 10 единиц. Сколько звонков в службу поддержки нам следует ожидать завтра?»

Серверная часть помещает задание <среда, 10>в очередь (какое-то место, отделенное от самой серверной части, например, Redis в случае MLQ). Очередь отвечает: «Спасибо, давайте назовем это заданием с идентификатором 562».

Как быстро и легко пользоваться нейросетью Midjourney? Инструкция

Бэкэнд отвечает пользователю: «Я сделаю этот расчет. У него ID 562. Пожалуйста, подождите». После этого серверная часть может свободно обслуживать других пользователей.

Веб-браузер пользователя начинает отображать счетчик «подождите».

Workers — по крайней мере, те, которые в данный момент не обрабатывают другое задание — постоянно опрашивают очередь на наличие заданий. Возможно, Workers существуют на другом сервере/компьютере, но они также могут быть разными потоками/процессами на том же компьютере. Workers могут иметь графические процессоры, тогда как внутреннему серверу, вероятно, это не нужно.

В конце концов, worker возьмет задание, удалит его из очереди и обработает (например, запустит через какую-нибудь модель XGBoost). Это сохранит прогноз в базе данных. Представьте, что этот шаг занимает 5 минут.

Между тем, веб-браузер пользователя каждые 30 секунд опрашивает серверную часть, чтобы узнать, выполнена ли еще задача 562. Серверная часть проверяет, есть ли в базе данных результат, сохраненный с идентификатором = 562, и отвечает соответствующим образом. Любой из наших многочисленных горизонтальных бэкэндов может обслуживать запрос пользователя. Вы можете подумать, что общая база данных — это единственная точка отказа, и вы будете правы! Но отдельно мы подготовили реплики и какой-то механизм аварийного переключения, возможно, сегментирование/балансировку нагрузки, так что все в порядке.

Через пять минут с лишним пользователь опрашивает результат, и мы можем его обслужить.

Здесь нужно немного больше, в основном для обеспечения отказоустойчивости и постоянства (что, если рабочий процесс отключится на полпути к выполнению задания? Что, если ввод пользователя будет ненужным и приведет к сбою задания?) Но это основы. Вот очень простой рабочий шаблон для MLQ.

Он просто ждет, пока не получит задание, затем запускает функцию с параметрами задания и сохраняет результат. Вы можете запускать столько этих вещей параллельно, сколько хотите, на одном и том же сервере или на распределенных серверах. Если вы посмотрите в репозиторий, вы найдете полный код для этого с моделью Nietzche/Tensorflow RNN.

Читайте также:
Как убрать значок щита на ярлыке программы

Есть несколько хороших доступных фреймворков очередей или вещей, которые делают подходящие очереди, включая Celery, Dask, ZeroMQ, родной Redis и библиотеку, которую я недавно сделал, чтобы быть простой в использовании версией всего этого для развертывания побочных проектов без сложностей: MLQ . Кафка тоже вещь, но постоянные читатели знают, что я не поклонник сверхархитектурных проектов на основе Java. MLQ незрелый; Я не пытаюсь продать это здесь. Вместо этого используйте Celery для серьезных проектов.

На этой неделе я провел некоторое время с NVIDIA и спросил об их каноническом решении для организации очереди заданий (в частности, в моем случае, чтобы я мог сделать ферму графических процессоров доступной для всех на работе с ноутбуком Jupyter, чтобы все они не пытались отправлять задания). в то же время). Его пока нет, но меня уверили, что над ним работают. А до тех пор единственным способом будет вручную свернуть решение с помощью системы очередей.

(Также, возможно, представляет интерес с этой встречи: все согласились, что MXNet — действительно хороший фреймворк, возможно, лучший — но, к сожалению, он может исчезнуть).

Источник: yandex.ru

Как прикрутить нейросеть к сайту по-быстрому

В данном материале предлагается, приложив небольшие усилия, соединить python 3.7+flask+tensorflow 2.0+keras+небольшие вкрапления js и вывести на web-страницу определенный интерактив. Пользователь, рисуя на холсте, будет отправлять на распознавание цифры, а ранее обученная модель, использующая архитектуру CNN, будет распознавать полученный рисунок и выводить результат. Модель обучена на известном наборе рукописных цифр MNIST, поэтому и распознавать будет только цифры от 0 до 9 включительно. В качестве системы, на которой все это будет крутиться, используется windows 7.

Небольшое вступление

Чем печальны книги по машинному обучению, так, пожалуй, тем, что код устаревает почти с выходом самой книги. И хорошо, если автор издания поддерживает свое дитя, сопровождая и обновляя код, но, зачастую все ограничивается тем, что пишут — вот вам requirements.txt, ставьте устаревшие пакеты, и все заработает.

Так вышло и в этот раз. Читая «Hands-On Python Deep Learning for the Web» авторства Anubhav Singh, Sayak Paul, сначала все шло хорошо. Однако, после первой главы праздник закончился. Самое неприятное было то, что заявленные требования в requirements в целом соблюдались.

Масло в огонь подлили и сами разработчики пакетов tensorflow и keras. Один пакет работает только с определенным другим и, либо даунгрейд одного из них либо бубен шамана.
Но и это еще не все. Оказывается, что некоторые пакеты еще и зависимы от архитектуры используемого железа!

Так, за неимением алтернативы железа, устанавливался tensorflow 2.0 на платформу с Celeron j1900 и, как оказалось, там нет инструкции AVX2:

И вариант через pip install tensorflow не работал.

Но не все так грустно при наличии желания и интернета!

Вариант с tensorflow 2.0 удалось реализовать через wheel — github.com/fo40225/tensorflow-windows-wheel/tree/master/2.0.0/py37/CPU/sse2 и установку x86: vc_redist.x86.exe, x64: vc_redist.x64.exe (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).

Keras был установлен с минимальной версией, с которой он «стал совместим» с tensorflow — Keras==2.3.0.

pip install tensorflow-2.0.0-cp37-cp37m-win_amd64.whl
pip install keras==2.3.0

Основное приложение

Рассмотрим код основной программы.

flask_app.py

from flask import Flask, render_template, request import imageio #https://imageio.readthedocs.io/en/stable/examples.html #from scipy.misc import imread, imresize #from matplotlib.pyplot import imread import numpy as np import tensorflow as tf from tensorflow.keras.models import model_from_json from skimage import transform,io

Как выяснилось imread, imresize устарели еще со времен scipy==1.0. Непонятно, как у автора все работало, учитывая, что книга относительно нова (2019). С современной scipy==1.6.1 книжный вариант кода не работал.

Загружаем с диска, компилируем модель нейросети:

json_file = open(‘model.json’,’r’) model_json = json_file.read() json_file.close() model = model_from_json(model_json) model.load_weights(«weights.h5») model.compile(loss=’categorical_crossentropy’,optimizer=’adam’,metrics=[‘accuracy’]) #graph = tf.get_default_graph() graph = tf.compat.v1.get_default_graph()

Здесь произведена замена на tf.compat.v1.get_default_graph() в виду несовместимости.

Далее часть, относящаяся к серверу на flask. «Прорисовка» шаблона страницы:

Часть, преобразующая картинку в числовой массив:

import re import base64 def convertImage(imgData1): imgstr = re.search(r’base64,(.*)’, str(imgData1)).group(1) with open(‘output.png’, ‘wb’) as output: output.write(base64.b64decode(imgstr))

Основная функция предсказания:

def predict(): global model, graph imgData = request.get_data() convertImage(imgData) #print(imgData) #x = imread(‘output.png’, mode=’L’) #x.shape #(280, 280) x = imageio.imread(‘output.png’,pilmode=’L’) #x = imresize(x, (28, 28)) #x = x.resize(x, (28, 28)) x = transform.resize(x, (28,28), mode=’symmetric’, preserve_range=True) #(28, 28) #type(x) # x = x.reshape(1, 28, 28, 1) #(1, 28, 28, 1) x = tf.cast(x, tf.float32) # perform the prediction out = model.predict(x) #print(np.argmax(out, axis=1)) # convert the response to a string response = np.argmax(out, axis=1) return str(response[0])

Закоментированы строки, которые были заменены на рабочие, а также оставлены выводы отдельных строк для наглядности.

Как все работает

После запуска командой python flask_app.py запускается локальный flask-сервер, который выводит index.html с вкраплением js.

Пользователь рисует на холсте цифру, нажимает «predict». Картинка «улетает» на сервер, где сохраняется и преобразуется в цифровой массив. Далее в бой вступает CNN, распознающая цифру и возвращающая ответ в виде цифры.

Читайте также:
Программа или функционально завершенный фрагмент программы предназначенный для хранения

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

*Можно покрутить слайдер, увеличивая или уменьшая толщину начертания цифры для целей распознавания.

Второй вариант программы — через API,curl

Поользователь загружает на сервер свое изображение с цифрой для распознавания и нажимает «отправить»:

Заменим index.js на следующий:

index.js:

$(«form»).submit(function(evt) < evt.preventDefault(); var formData = new FormData($(this)[0]); $.ajax(< url: ‘/predict/’, type: ‘POST’, data: formData, async: false, cache: false, contentType: false, enctype: ‘multipart/form-data’, processData: false, success: function (response) < $(‘#result’).empty().append(response); >>); return false; >);

Шаблон страницы также изменится:

Источник: habr.com

Как создать нейросеть с помощью chatGPT

Как создать нейросеть с помощью chatGPT

ChatGPT – прекрасное средство для создания и обучения нейронных сетей, подготовки датасетов и проведения экспериментов.

erid: LjN8KRuAv
ИТ Медиа

erid: LjN8KRuAv
ИТ Медиа

Многие слышали о нашумевшей нейронной сети chatGPT от OpenAI, которая способна решать множество текстовых задач: отвечать на вопросы, генерировать идеи и т. д. ChatGPT успешно используется для программирования, так как умеет писать код, находить ошибки в коде, комментировать код и многое другое. Логично, что мы, как Университет искусственного интеллекта, специализируемся на искусственном интеллекте и, естественно, решили попробовать использовать chatGPT для генерации и обучения нейронных сетей и проведения экспериментов.

У нас это получилось: chatGPT не только применима, но и значительно упрощает работу по генерации архитектуры нейронных сетей и проведению экспериментов. Ниже приводен пример решения задачи классификации водителей на внимательных, засыпающих, отвлекающихся на телефон и т. п. — классификация изображений на 10 классов.

Типовая задача, решать ее мы будем комплексно, начиная с подготовки датасета, который необходим для обучения нейронных сетей. В нашем случае это zip-архив, который надо скачать, подготовить, превратить в обучающие выборки, нормировать и преобразовать перед тем, как подать в нейронную сеть. Часто это гораздо больший рутинный труд для разработчика, чем само обучение нейронной сети.

Мы сделаем и то, и другое исключительно с помощью запросов к chatGPT — вся статья представляет собой только запросы в chatGPT, без единой строчки рукописного кода – это был важный критерий. Приводим успешные запросы и пару ошибок для примера. При работе с chatGPT важно уметь правильно задать системе запрос.

Она умная и отлично понимает даже сложные комплексные запросы, но иногда человек формулирует запрос так, что системе он не понятен. Поэтому важный скил программирования с помощью chatGPT – промт-инжиниринг, умение правильно поставить задачу.

Вообще работа с chatGPT похожа на работу с очень умным junior’ом, который знает всё, что только можно знать в Интернете, но некоторые задачи понимает не так, как нужно. И, повторяю, результат зависит от умения правильно поставить ему задачу. Важный момент: мы будем обсуждать машинное обучение, создание нейронных сетей, поэтому аудитория может разделиться на две части.

Первая – те, кто разбирается в машинном обучении и в библиотеке Keras. Для них будут интересны и сами запросы к chatGPT, которые мы сформулировали, и код, который она создает. Вторая часть аудитории – это разработчики, которые не разбираются в машинном обучении и Keras.

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

Запрос № 1 к chatGPT:

Напиши подготовку тренировочных данных для нейронной сети по классификации изображений, для чего напиши код скачивания датасета при помощи gdown по этой ссылке и код разархивации датасета из zip-формата в директорию ‘content/cars’. Датасет не поделен на train и test.

Он состоит из 10 папок (название каждой соответствует названию категории), каждый файл необходимо открыть при помощи Image.open, не используй генератор. Добавь в код масштабирование данных и приведи y_train к формату one hot encoding. Используй LabelEncoder для кодирования строковых меток в целые числа. Определи список названий классов и количество классов. Создай простую keras-модель на получившихся данных. Ответ chatGPT: import os import gdown import zipfile from PIL import Image from sklearn.preprocessing import LabelEncoder from sklearn.utils import shuffle from sklearn.model_selection import train_test_split import numpy as np from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D # Скачиваем датасет url = ‘ https://storage.yandexcloud.net/aiueducation/marketing/datasets/reality.zip gdown.download(url, ‘reality.zip’, quiet= False ) # Распаковываем набор данных with zipfile.ZipFile( «reality.zip»,»r» ) as zip_ref: zip_ref.extractall( «content/cars» ) # Загружаем изображения и ярлыки X = [] y = [] classes = os.listdir( «content/cars» ) for i, class_name in enumerate ( classes ): for image_name in os.listdir( «content/cars/» + class_name): image = Image. open ( «content/cars/» + class_name + «/» + image_name) image = image.resize(( 64, 64 )) X.append(np.array(image)) y.append(class_name) # Масштабируем данные X = np.array(X) / 255.0 # Кодируем ярлыки label_encoder = LabelEncoder() y = label_encoder.fit_transform(y) # Приводим ярлыки к формату One-hot encoding num_classes = len(np.unique(y)) y = to_categorical(y, num_classes) # Перемешиваем данные X, y = shuffle(X, y) # Делим набор данных на тренировочную и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Создаем простую модель keras model = Sequential() model.add(Conv2D( 32 , ( 3, 3 ), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dense(num_classes, activation= ‘softmax’ )) model. compile (optimizer= ‘adam’ , loss= ‘categorical_crossentropy’ ,
metrics=[ ‘accuracy’ ])

Читайте также:
Программа закрывается при сворачивании

Запрос № 2 к chatGPT:

Как создать нейросеть с помощью chatGPT. Рис. 1

Теперь напиши, как дополнить этот код, чтобы запустить обучение модели на 10 эпохах, построй график точности по эпохам. Ответ chatGPT: import matplotlib.pyplot as plt # Обучаем модель history = model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) # Рисуем график точности по эпохам обучения plt.plot(history.history[ ‘accuracy’ ]) plt.plot(history.history[ ‘val_accuracy’ ]) plt.title( ‘Model accuracy’ ) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend([ ‘Train’ , ‘Test’ ], loc= ‘upper left’ ) plt.show()
Текстовый комментарий chatGPT: «Добавив этот код, мы запускаем обучение модели на 10 эпохах. Мы сохраняем результат обучения в переменной history, чтобы построить график точности модели по эпохам. Мы используем plt.plot() для отображения истории обучения из history.history[‘accuracy’] (точность на обучающем наборе) и history.history[‘val_accuracy’] (точность на тестовом наборе). И далее добавляем легенду и отображаем график».

Запрос № 3 к сhatGPT:

Это слишком простая модель. Создай более мощную модель, код запуска обучения, график точности, проверь в цикле различные batch_size (32, 64, 128). Ответ chatGPT: from keras.layers import Dropout, BatchNormalization # Создаем более мощную модель model = Sequential() model.add(Conv2D(32, (3, 3), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 64 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 128 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dropout( 0.5 )) model.add(Dense(num_classes, activation= ‘softmax ‘ )) model. compile (optimizer= ‘adam’ , loss= ‘categorical_crossentropy’ ,
metrics=[ ‘accuracy’ ]) batch_sizes = [ 32, 64, 128 ] for batch_size in batch_sizes: # Обучаем модель history = model.fit(X_train, y_train, epochs=10, batch_size=batch_size,
validation_data=(X_test, y_test)) # Рисуем график точности по эпохам обучения plt.plot(history.history[ ‘accuracy’ ]) plt.plot(history.history[ ‘val_accuracy’ ]) plt.title( f ‘Model accuracy with batch size ‘) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend([ ‘Train’ , ‘Test’ ], loc= ‘upper left’ ) plt.show() Как создать нейросеть с помощью chatGPT. Рис. 2 Как создать нейросеть с помощью chatGPT.</p><p> Рис. 3Как создать нейросеть с помощью chatGPT. Рис. 4
Получилось не совсем то, что мы хотели: код, созданный chatGPT, не проверяет точность при разных batch_size, а дообучает модель на их разных размерах. Необходимо было более точно составить запрос.

Запрос № 4 к chatGPT:

Сделай код запуска этой модели в цикле с разными размерами batch_size (32, 64, 128), выведи график точности по каждому запуску. Ответ chatGPT: batch_size_list = [ 32, 64, 128 ] for batch_size in batch_size_list: # Создаем более мощную модель model = Sequential() model.add(Conv2D( 32 , ( 3, 3 ), activation= ‘relu’ , input_shape=( 64, 64, 3 ))) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D(64, ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Conv2D( 128 , ( 3, 3 ), activation= ‘relu’ )) model.add(BatchNormalization()) model.add(MaxPooling2D(( 2, 2 ))) model.add(Flatten()) model.add(Dropout( 0.5 )) model.add(Dense(num_classes, activation= ‘softmax’ )) model. compile (optimizer=’adam’, loss= ‘categorical_crossentropy’ , metrics=[ ‘accuracy’ ]) # Обучаем модель history = model.fit(X_train, y_train, epochs=10, batch_size=batch_size,
validation_data=(X_test, y_test))
# Рисуем график точности по эпохам обучения plt.plot(history.history[‘accuracy’], label= f ‘batch size : ‘ ) plt.title( ‘Model accuracy with different batch sizes’ ) plt.ylabel( ‘Accuracy’ ) plt.xlabel( ‘Epoch’ ) plt.legend(loc= ‘upper left’ ) plt.show() Как создать нейросеть с помощью chatGPT. Рис. 5 Как создать нейросеть с помощью chatGPT. Рис.</p><p> 6Как создать нейросеть с помощью chatGPT. Рис. 7
Таким образом, мы получили (хоть и не с первого раза) то, что хотели (почти). Стоило добавить, что графики нужно было отрисовывать по точности на проверочной выборке.

Запрос № 5 к chatGPT:

  1. Использование более мощной модели: использование большего количества сверточных слоев, нейронов и слоев связи.
  2. Использование более большого датасета: использование большего количества данных для обучения модели может увеличить точность.
  3. Дополнительная аугментация данных: использование аугментации данных, такой как повороты, масштабирование и другие, может помочь модели обобщаться на новые данные.
  4. Использование сверточных сетей, предварительно обученных (Transfer Learning): использование предварительно обученных сверточных сетей может существенно увеличить точность модели.
  5. Использование другой оптимизации и другой функции потерь для обучения модели: использование более эффективных алгоритмов оптимизации, таких как Adam, RMSprop или Adagrad и использование более подходящей функции потерь для задачи классификации, такой как categorical_crossentropy или sparse_categorical_crossentropy, может помочь улучшить точность модели.
  6. Использование регуляризации: использование регуляризации, такой как L1 и L2, может помочь предотвратить переобучение модели.
  7. Использование стандартизации данных: использование стандартизации данных может помочь сделать данные более однородными и улучшить точность модели.

Запрос № 6

Сделай в цикле проверку точности последней модели с разными оптимизаторами и выведи график сравнения полученных точностей.

Ответ chatGPT:

from keras import optimizers

optimizer_list = [ ‘adam’, ‘sgd’, ‘rmsprop’, ‘adagrad’ ]

for optimizer in optimizer_list:

Источник: www.it-world.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru