Машинное обучение с использованием набора 3D-данных очень важно для компьютерного зрения. Автомобилям самоуправляемые нужны огромные объемы 3D-данных, чтобы они работали и работали эффективно. В этой статье я использую 3D-версию набора данных MNIST, доступного на kaggle, и показываю, как предварительно обрабатывать и визуализировать данные, а также создавать 3D-модель сверточной нейронной сети (CNN) для соответствия этим данным.

Прежде чем перейти к созданию модели, самое время перейти к kaggle to download the dataset. Если вы читали описание вокселизации на kaggle и не могли понять, что происходит, не бойтесь, я попытаюсь объяснить это ниже, иначе вы можете перейти к разделу визуализации данных.

Воксель: воксель можно рассматривать как часть 3D-изображения. если вы возьмете 2D-матрицу, то она будет разделена на ячейки, что будет сделано путем пересечения двух строк (ширина) и двух столбцов (высота). В трехмерном пространстве это известно как воксель, воксель имеет ширину и высоту, а также длину. Другими словами, ячейка может быть представлена ​​как (x, y), а воксель представлен как (x, y, z). подобно тому, как клетки повторяются, образуя матрицу, воксели также повторяются, формируя трехмерное изображение. Процесс разделения 3D-изображения называется вокселизацией.

Визуализация данных

Для визуализации данных мы будем использовать plotly.j. Я обнаружил, что это очень полезно, когда дело доходит до интерактивных 3D-графиков. Ниже представлен рендеринг цифры 9 в colab (весь мой код Google colab можно найти здесь).

Покажите мне код

Kaggle уже сделал всю очистку за нас, поэтому нам больше не нужно этого делать. Для начала откройте файл и назначьте переменные тестовому и обучающему наборам данных, предоставленным Kaggle. Теперь, поскольку мы будем иметь дело с 3D-данными, а данные обучения и испытаний являются 2D-данными, нам нужно преобразовать 2D-данные в 3D. Мы преобразуем его из n*4096*3, где n — номер столбца. Поскольку мы выполняем мультиклассификацию с глубоким обучением, вспомогательная функция to_categorical(y,num_classes)one-hot кодирует y, который представляет наши классы.

Добавить цвет

К сожалению, преобразование данных только в 3D не помогает в нашей классификации, поскольку мы будем добиваться успехов в трех разных измерениях, нам нужно добавить еще один параметр в набор данных, чтобы размер нашего набора данных был 4D. четвертое измерение здесь — цвет, и вспомогательная функция add_color(array) делает именно это. Окончательный набор данных преобразуется в тензор n*3*16*16*16, чтобы подготовить его к нашим трехмерным сверткам.

Построение модели

При построении модели я предлагаю вам попробовать некоторые свертки и объединение, чтобы увидеть, как работает ваша модель, но если нет, вы можете протестировать мою модель, чтобы увидеть, как она работает, или даже попробовать передать обучение. Что бы вы ни делали, не копируйте и не вставляйте, не пытаясь понять, что происходит (в этом вся цель этой статьи).

Обучайте и тестируйте

Прежде чем мы приступим к обучению или тестированию модели, нам нужно выполнить эти партии, поскольку colab ram не может обрабатывать все сразу. поскольку мы не можем использовать это напрямую в пакетах без создания какого-либо загрузчика данных, именно это мы и собираемся сделать.

Для пользовательского загрузчика данных Pytorch требуются методы getitem, init и len, поэтому просто добавьте их, как у меня в моем коде colab googe, и получите соответствующие загрузчики данных для обучающих и тестовых наборов. Одна важная вещь, которую я обнаружил, заключалась в том, что небольшие размеры партий (‹ 30), как правило, не помогают с точки зрения производительности модели, поэтому выбирайте что-то вроде ≥ 100. Вы можете поиграть с этим параметром. если ваши потери при обучении имеют тенденцию к плато через одну или две эпохи, ваша модель, вероятно, не учится на наборе данных, и вам может потребоваться увеличить размер пакета из загрузчика данных.

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

Результаты

Сначала я запустил случайный лес в наборе данных, так как я нашел его очень «мощным», когда дело доходит до задач классификации, и он достиг точности 67,85%. 3D CNN после 35 эпох достигла точности 68,10%, и хотя это не так уж сильно отличается от случайного леса, я считаю, что эксперименты с разными моделями дадут гораздо более высокую точность (> 75%) для того же набора данных. Для эпох я думаю, что от 20 до 30 эпох должно быть достаточно для простой модели, но и для более сложных моделей не стесняйтесь экспериментировать и с этим. Ниже приведены потери при обучении и тестировании для первого запуска модели.

Итак, если какая-то часть статьи показалась вам запутанной или трудной для понимания, оставьте ее в комментариях.

Ссылка на мой код colabздесь