Выбрать страницу

Многие слышали о нашумевшей нейронной сети 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!