Как создать нейросеть с помощью chatGPT
Многие слышали о нашумевшей нейронной сети 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:
Теперь напиши, как дополнить этот код, чтобы запустить обучение модели на 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 {batch_size}')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
Получилось не совсем то, что мы хотели: код, созданный 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: {batch_size}')
plt.title('Model accuracy with different batch sizes')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(loc='upper left')
plt.show()
Таким образом, мы получили (хоть и не с первого раза) то, что хотели (почти). Стоило добавить, что графики нужно было отрисовывать по точности на проверочной выборке.
Запрос № 5 к chatGPT:
Как увеличить аккураси нашей модели?
Ответ chatGPT:
Есть различные способы увеличить точность модели:
-
Использование более мощной модели: использование большего количества сверточных слоев, нейронов и слоев связи.
-
Использование более большого датасета: использование большего количества данных для обучения модели может увеличить точность.
-
Дополнительная аугментация данных: использование аугментации данных, такой как повороты, масштабирование и другие, может помочь модели обобщаться на новые данные.
-
Использование сверточных сетей, предварительно обученных (Transfer Learning): использование предварительно обученных сверточных сетей может существенно увеличить точность модели.
-
Использование другой оптимизации и другой функции потерь для обучения модели: использование более эффективных алгоритмов оптимизации, таких как Adam, RMSprop или Adagrad и использование более подходящей функции потерь для задачи классификации, такой как categorical_crossentropy или sparse_categorical_crossentropy, может помочь улучшить точность модели.
-
Использование регуляризации: использование регуляризации, такой как L1 и L2, может помочь предотвратить переобучение модели.
-
Использование стандартизации данных: использование стандартизации данных может помочь сделать данные более однородными и улучшить точность модели.
Запрос № 6
Сделай в цикле проверку точности последней модели с разными оптимизаторами и выведи график сравнения полученных точностей.
Ответ chatGPT:
from keras import optimizers
optimizer_list = ['adam', 'sgd', 'rmsprop', 'adagrad']
for optimizer in optimizer_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=optimizer, loss='categorical_crossentropy',
metrics=['accuracy'])
# Обучаем модель
history = model.fit(X_train, y_train, epochs=10, batch_size=32,
validation_data=(X_test, y_test))
# Рисуем график точности по эпохам обучения
plt.plot(history.history['accuracy'], label=optimizer)
plt.title('Model accuracy with different optimizers')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(loc='upper left')
plt.show()
Текстовый комментарий chatGPT: «В этом коде используется цикл for, чтобы протестировать точность модели с различными оптимизаторами и отобразить график сравнения полученных точностей. В каждой итерации цикла инициализируется модель с различным оптимизатором, затем обучается и отображается график точности по эпохам для каждого оптимизатора. В конце цикла график отображается с использованием plt.show(), чтобы можно было сравнить точности моделей с различными оптимизаторами».
Запрос № 6 к chatGPT:
Напиши код запуска предыдущей модели, заменив Flatten на GlobalMaxPooling2D, оптимизатор Adam, batch_size = 32, добавь слой Dropout после каждого BatchNormalization. Выведи график обучения на проверочной выборке (в этот раз не допустим недосказанности и уточним, по какой выборке следует отрисовывать графики).
Ответ chatGPT:
# Создаем более мощную модель
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(MaxPooling2D((2, 2)))
model.add(GlobalMaxPooling2D())
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=32,
validation_data=(X_test, y_test))
# Рисуем график точности по эпохам обучения
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy with GlobalMaxPooling2D')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.show()
Обучение не запустилось, не импортирован используемый в архитектуре модели слой. Попросим chatGPT исправить ошибку:
Запрос № 7 к chatGPT:
При выполнении кода получаем ошибку NameError: name
'GlobalMaxPooling2D' is not defined. Исправь.
Ответ chatGPT:
Эта ошибка возникает из-за того, что класс GlobalMaxPooling2D не импортирован из модуля keras. Чтобы исправить это, необходимо добавить следующую строку кода в начало файла:
from keras.layers import GlobalMaxPooling2D
from keras.layers import GlobalMaxPooling2D
# Создаем более мощную модель
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.2))
model.add(GlobalMaxPooling2D())
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=32,
validation_data=(X_test, y_test))
# Рисуем график точности по эпохам обучения
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy with GlobalMaxPooling2D')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Validation'], loc='upper left')
plt.show()
Все наши "пожелания" учтены, модель обучается на нужных нам параметрах. Следует отметить, что архитектура модели, предложенная chatGPT в самом начале, явно показывает лучшую точность на проверочной выборке, чем результаты наших экспериментов, хотя попробовать стоило.
Выводы
-
Благодаря chatGPT можно вообще обойтись без написания кода. Однако необходимо давать подробные инструкции, как «устроены» наши данные, в каком они формате, что содержат и как их следует подготавливать.
-
Порой chatGPT все же допускает неточности – может забыть импортировать библиотеку или слой. Это легко исправляется: достаточно написать в chatGPT содержание ошибки и попросить исправить – будет предложено один или несколько вариантов, как решить проблему.
-
Необходимо внимательно просматривать код, предложенный chatGPT, на предмет того, получили ли мы желаемый результат. Код может срабатывать, но из-за неточных инструкций выдавать не то, что от него ожидается.
-
Чат достаточно часто вылетает, но это не проблема. Достаточно перезагрузить страницу либо еще раз зайти в нужный чат – не обязательно начинать «с нуля».
-
Важно всегда в сообщениях любым образом показывать, что нужно именно продолжить уже начатый код, иначе chatGPT может потерять нить и не учесть, что было уже сделано.
-
Можно запросить подробные комментарии к коду – и chatGPT разъяснит каждую строчку или операцию. Очень удобно для начинающих программистов.
-
Имеет смысл избегать команд «скачай» и «загрузи», заменив их на «напиши код для скачивания архива», например. В противном случае chatGPT ответит, что не умеет ничего скачивать, и напишет базовые рекомендации.
* * *
ChatGPT – прекрасное средство для создания и обучения нейронных сетей, подготовки датасетов и проведения экспериментов. Важно понимать, что chatGPT – это только инструмент для ускорения разработки, то есть с его помощью можно написать большой объем кода гораздо быстрее, чем вручную. А еще — быстро получить обращение к библиотекам, код которых почти никто никогда не помнит наизусть. Вместо того, чтобы гуглить, написать: «Создай мне этот код с помощью такой-то библиотеки», – и получить код от chatGPT.
Важно помнить, что chatGPT никак не заменяет знания нейронных сетей и программирования. Если разработчик не знает, какие библиотеки где применять, какие слои у нейронных сетей, как нейронная сеть должна обучаться, что такое точности и многое другое, — он не поймет, как правильно формулировать запросы к chatGPT. Поэтому chatGPT никоим образом не конкурирует с экспертностью AI-разработчика – повторяю, это всего лишь инструмент упрощения и ускорения работы.
Желаем вам приятной работы с помощью chatGPT!
Опубликовано 20.03.2023