В современном мире найти решение проблемы легко, но найти оптимальное решение сложнее.

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

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

Знакомство с neptune.ai

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

Руководство по быстрой установке Neptune на Python

Настроить проект и подключить ваши скрипты к Neptune очень просто. Давайте позаботимся об этом быстро.

Шаг 1. Зарегистрируйтесь и создайте проект.

  • Зайдите в приложение Нептун,
  • Зарегистрируйте аккаунт, если вы еще этого не сделали,
  • Нажмите кнопку «Новый проект» слева,
  • Дайте ему имя,
  • Решите, хотите ли вы, чтобы это было общедоступным или частным,
  • Сделанный.

Шаг 2. Получите токен API. Вам понадобится токен API Neptune (ваш личный ключ) для подключения сценариев, которые вы запускаете с помощью Neptune.

  • Нажмите на свой логотип пользователя в правой части экрана,
  • Нажмите «Получить свой токен API»,
  • Скопируйте свой токен API,
  • Вставьте его в переменную среды, файл конфигурации или непосредственно в свой скрипт.

Шаг 3. Установите клиентскую библиотеку Neptune:

Поскольку я использую Python, я буду использовать клиент Python, но вы также можете использовать Neptune с языком R.

pip install neptune

Шаг 4: Инициализация Нептуна

Теперь, когда у вас все настроено, вы можете приступить к мониторингу!

Сначала подключите свой скрипт к Нептуну, добавив в начало скрипта следующее:

import neptune
run = neptune.init_run(
  project="workspace/project-name",
  api_token="your-api-token",
)

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

запустить[“WHAT_YOU_WANT_TO_LOG”] = ​​ITS_VALUE

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

Для более глубокого понимания ознакомьтесь с подробной документацией Neptune.

Использование Нептуна в коде

Теперь, когда вы настроили Нептун, пришло время приступить к созданию нашей первоначальной модели.

Я создам модель, которая сможет распознавать цифры на изображениях, используя набор данных MNIST. Наша главная цель — показать, как Нептун может быть невероятно полезен при разработке модели искусственного интеллекта.

Импортируйте всю необходимую библиотеку:

#Importing Libraries
import neptune
import numpy as np
from numpy import mean
from numpy import std
from tensorflow.keras.datasets import mnist
from tensorflow.keras.callbacks import Callback
from sklearn.model_selection import train_test_split, KFold
from sklearn.metrics import confusion_matrix
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten
from tensorflow.keras.optimizers import SGD
import matplotlib.pyplot as plt
import itertools

Настройка запуска Нептуна и запись гиперпараметров, потерь и точности для каждой эпохи:

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

# Creating a neptune run to log all the metrics and experiment parameter
run = neptune.init_run(
  project="gajanand.chowdhary/mnist-classification",
  api_token="#your-api-token",
 )

# Hyperparameters to be used in the current experiment
params = {"batch_size":32,'epochs':10,'learning_rate':0.01}
run['parameters'] = params

# Custom Callback to log the metrics in neptune for each epoch in training
class CustomNeptuneCallback(Callback):
  def __init__(self, run):
    super().__init__()
    self.run = run
  def on_epoch_end(self, epoch, logs=None):
    self.run['accuracy'].append( logs['accuracy'])
    self.run['loss'].append( logs['loss'])
    self.run['val_loss'].append( logs['val_loss'])
    self.run['val_accuracy'].append( logs['val_accuracy'])

Подготовка набора данных MNIST:

Мы воспользуемся полезным служебным модулем keras, чтобы получить набор данных и подготовить его для непосредственного использования с нашей моделью.

# load train and test dataset
def load_dataset():
  # load dataset
  (trainX, trainY), (testX, testY) = mnist.load_data()
  # reshape dataset to have a single channel
  trainX = trainX.reshape((trainX.shape[0], 28, 28, 1))
  testX = testX.reshape((testX.shape[0], 28, 28, 1))
  print(type(trainX))
  # one hot encode target values
  trainY = to_categorical(trainY)
  testY = to_categorical(testY)
  return trainX, trainY, testX, testY

# scale pixels
def prep_pixels(train, test):
  # convert from integers to floats
  train_norm = train.astype('float32')
  test_norm = test.astype('float32')
  # normalize to range 0–1
  train_norm = train_norm / 255.0
  test_norm = test_norm / 255.0
  # return normalized images
  return train_norm, test_norm

Подготовка и оценка модели:

Чтобы построить модель, которая сможет идентифицировать цифру по изображению, мы создадим базовую архитектуру CNN. Эта архитектура будет иметь входной уровень, за которым следуют уровень максимального пула и плотный уровень.

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

# define cnn model
def define_model():
  model = Sequential()
  model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', input_shape=(28, 28, 1)))
  model.add(MaxPooling2D((2, 2)))
  model.add(Flatten())
  model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
  model.add(Dense(10, activation='softmax'))
  # compile model
  opt = SGD(learning_rate=params['learning_rate'], momentum=0.9)
  model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
  return model

# evaluate a model using k-fold cross-validation
def evaluate_model(dataX, dataY, n_folds=2):
  scores, histories = list(), list()
  np_callback = CustomNeptuneCallback(run)
  model = define_model()
  # select rows for train and test
  trainX, testX, trainY, testY = train_test_split(dataX, dataY, test_size=0.2, random_state=42)
  # fit model
  history = model.fit(trainX, trainY, epochs=params['epochs'], batch_size=params['batch_size'], validation_data=(testX, testY), verbose=0, callbacks = [np_callback])
  # evaluate model
  _, acc = model.evaluate(testX, testY, verbose=0)
  print('> %.3f' % (acc * 100.0))
  return model, history

Собираем все функции вместе:

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

def run_test_harness():
  # load dataset
  trainX, trainY, testX, testY = load_dataset()
  # prepare pixel data
  trainX, testX = prep_pixels(trainX, testX)
  # evaluate model
  model, histories = evaluate_model(trainX, trainY)
  predicted_labels = np.argmax(model.predict(testX), axis=-1)
  true_labels = np.argmax(testY, axis=-1)
  # Create the confusion matrix
  cm = confusion_matrix(true_labels, predicted_labels)
  plot_confusion_matrix(cm, "mnist-cm", [0,1,2,3,4,5,6,7,8,9])
  run["test/conf_matrix"].upload("confusion-matrix.png")
  def myprint(s):
  with open('modelsummary.txt','a') as f:
  print(s, file=f)
  model.summary(print_fn=myprint)
  run["model/model_summary"].upload("modelsummary.txt")

run_test_harness()

Вот как мы можем построить модель с помощью neptune.ai, провести множество экспериментов, эффективно управлять всеми параметрами, показателями производительности каждого эксперимента и решить, какая модель лучше всего подходит для конкретного варианта использования.

Изучение панели управления Нептуна

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

Начните с панели мониторинга (рис. 1) со списком всех запусков в рамках созданного проекта. Мы можем получить все подробности запуска на вкладке «Детали запуска» или сравнить наши различные эксперименты, используя вкладку «Сравнить запуски».

Рисунок 1. Панель мониторинга: список запусков с уникальным идентификатором

Мы можем выбрать столько прогонов/экспериментов, сколько нам нужно, и сравнить зарегистрированные показатели точности и потерь, матрицу ошибок, параметры, используемые в эксперименте, а также спланировать другие эксперименты на основе приведенного ниже анализа.

Рисунок 2. Сравнение точности и потерь

С помощью приведенного выше сравнения различных прогонов мы можем сделать вывод, что прогон «MNIS-2» показал лучшие результаты с данным набором параметров.

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

Рисунок 4. Сравнение гиперпараметров экспериментов.

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

Рисунок 5. Исходный код: полный сценарий

Рисунок 6. Сводная информация о модели

Финальное подведение итогов

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

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