Idx3 ubyte чем открыть

Обновлено: 07.07.2024

Машинное обучение — это область искусственного интеллекта, использующая статистические методы, чтобы предоставить компьютерным системам способность «учиться». То есть постепенно улучшать производительность в конкретной задаче, с помощью данных без явного программирования. Хороший пример — то, насколько эффективно (или не очень) Gmail распознает спам или насколько совершеннее стали системы распознавания голоса с приходом Siri, Alex и Google Home.

С помощью машинного обучения решаются следующие задачи:

  • Распознавание мошенничества — отслеживание необычных шаблонов в транзакциях кредитных карт или банковских счетов
  • Предсказание — предсказание будущей цены акций, курса обмена валюты или криптовалюты
  • Распознавание изображений — определение объектов и лиц на картинках

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

Обучение с учителем

Обучение с учителем — один из видов машинного обучения. Его идея заключается в том, что систему сначала учат понимать прошлые данные, предлагая много примеров конкретной проблемы и желаемый вывод. Затем, когда система «натренирована», ей можно давать новые входные данные для предсказания выводов.

Например, как создать спам-детектор? Один из способов — интуиция. Можно вручную определять правила: например «содержит слово деньги» или «включает фразу Western Union». И пусть иногда такие системы работают, в большинстве случаев все-таки сложно создать или определить шаблоны, опираясь исключительно на интуицию.

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

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

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

Схема обучения с учителем

Невозможно говорить о машинном обучении с учителем, не затронув модели обучения с учителем. Это как говорить о программировании, не касаясь языков программирования или структур данных. Модели обучения — это те самые структуры, что поддаются тренировке. Их вес (или структура) меняется по мере того, как они формируют понимание того, что нужно предсказывать. Есть несколько видов моделей обучения, например:

  • Случайный лес (random forest)
  • Наивный байесовский классификатор (naive Bayes)
  • Логистическая регрессия (logistic regression)
  • Метод k-ближайших соседей (k nearest neighbors)

В этом материале в качестве модели будет использоваться нейронная сеть.

Понимание работы нейронных сетей

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

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

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

Процесс активации каждого нейрона

  • Эта диаграмма иллюстрирует процесс активации, через который проходит каждый нейрон. Рассмотрим схему слева направо.
  • Все вводные данные (числовые значения) из входящих нейронов считываются. Они определяются как x1…xn.
  • Каждый ввод умножается на взвешенную сумму, ассоциированную с этим соединением. Ассоциированные веса обозначены как W1j…Wnj.
  • Все взвешенные вводы суммируются и передаются активирующей функции. Она читает этот ввод и трансформирует его в числовое значение k-ближайших соседей.
  • В итоге числовое значение, которое возвращает эта функция, будет вводом для другого нейрона в другом слое.

Слои нейронной сети

Нейроны внутри нейронной сети организованы в слои. Слои — это способ создать структуру, где каждый содержит 1 или большее количество нейронов. В нейронной сети обычно 3 или больше слоев. Также всегда определяются 2 специальных слоя, которые выполняют роль ввода и вывода.

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

Слои между ними описываются как «скрытые слои». Именно там происходят все вычисления. Все слои в нейронной сети кодируются как признаковые описания.

Выбор количества скрытых слоев и нейронов

Нет золотого правила, которым стоит руководствоваться при выборе количества слоев и их размера (или числа нейронов). Как правило, стоит попробовать как минимум 1 такой слой и дальше настраивать размер, проверяя, что работает лучше всего.

Скрытые слои и нейроны

Использование библиотеки Keras для тренировки простой нейронной сети, которая распознает рукописные цифры

Программистам на Python нет необходимости заново изобретать колесо. Такие библиотеки, как Tensorflow, Torch, Theano и Keras уже определили основные структуры данных для нейронной сети, оставив необходимость лишь декларативно описать структуру нейронной сети.

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

Как уже упоминалось, есть два специальных уровня, которые должны быть определены на основе конкретной проблемы: размер слоя ввода и размер слоя вывода. Все остальные «скрытые слои» используются для изучения сложных нелинейных абстракций задачи.

В этом материале будем использовать Python и библиотеку Keras для предсказания рукописных цифр из базы данных MNIST.

Запуск Jupyter Notebook локально

Список необходимых библиотек:

  • numpy
  • matplotlib
  • sklearn
  • tensorflow

Запуск из интерпретатора Python

Для запуска чистой установки Python (любой версии старше 3.6) установите требуемые модули с помощью pip.

Рекомендую (но не обязательно) запускать код в виртуальной среде.

Если эти модули установлены, то теперь можно запускать весь код в проекте.

База данных MNIST

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

Натренировать систему, классифицировать каждое соответствующим ярлыком (изображенной цифрой). С помощью набора данных из 60 000 изображений рукописных цифр (представленных в виде изображений 28х28 пикселей, каждый из которых является градацией серого от 0 до 255).

Набор данных

Набор данных состоит из тренировочных и тестовых данных, но для упрощения здесь будет использоваться только тренировочный. Вот так его загрузить:

Как скачать датасет MNIST в Jupyter Notebook

Чтение меток

Есть 10 цифр: (0-9), поэтому каждая метка должна быть цифрой от 0 до 9. Загруженный файл, train-labels-idx1-ubyte.gz , кодирует метки следующим образом:

Файл ярлыка тренировочного набора (train-labels-idx1-ubyte):

[offset][type][value][description]
000032 bit integer0x00000801(2049)magic number (MSB first)
000432 bit integer60000number of items
0008unsigned byte??label
0009unsigned byte??label
……………………
xxxxunsigned byte??label

Значения меток от 0 до 9.

Первые 8 байт (или первые 2 32-битных целых числа) можно пропустить, потому что они содержат метаданные файлы, необходимые для низкоуровневых языков программирования. Для парсинга файла нужно проделать следующие операции:

  • Открыть файл с помощью библиотеки gzip, чтобы его можно было распаковать
  • Прочитать весь массив байтов в память
  • Пропустить первые 8 байт
  • Перебирать каждый байт и приводить его к целому числу

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

Чтение изображений

[offset][type][value][description]
000032 bit integer0x00000803(2051)magic number
000432 bit integer60000number of images
000832 bit integer28number of rows
001232 bit integer28number of columns
0016unsigned byte??pixel
0017unsigned byte??pixel
……………………
xxxxunsigned byte??pixel

Чтение изображений немного отличается от чтения меток. Первые 16 байт содержат уже известные метаданные. Их можно пропустить и переходить сразу к чтению изображений. Каждое из них представлено в виде массива 28*28 из байтов без знака. Все что требуется — читать по одному изображению за раз и сохранять их в массив.

Вывод: (60000, 784)

В списке 60000 изображений. Каждое из них представлено битовым вектором размером SIZE_OF_ONE_IMAGE . Попробуем построить изображение с помощью библиотеки matplotlib :

Вывод изображения с помощью matplotlib

Кодирование меток изображения с помощью One-hot encoding

Будем использовать one-hot encoding для превращения целевых меток в вектор.

Были успешно созданы входные данные и векторный вывод, который будет поступать на входной и выходной слои нейронной сети. Вектор ввода с индексом i будет отвечать вектору вывода с индексом i .

Изображение с индексом 999 — цифруа 6

В примере выше явно видно, что изображение с индексом 999 представляет цифру 6. Ассоциированный с ним вектор содержит 10 цифр (поскольку имеется 10 меток), а цифра с индексом 6 равно 1. Это значит, что метка правильная.

Разделение датасета на тренировочный и тестовый

Для проверки того, что нейронная сеть была натренирована правильно, берем определенный процент тренировочного набора (60 000 изображений) и используем его в тестовых целях.

Здесь видно, что весь набор из 60 000 изображений бал разбит на два: один с 45 000, а другой с 15 000 изображений.

Тренировка нейронной сети с помощью Keras

Для обучения нейронной сети, выполним этот код.

Проверяем точность на тренировочных данных.

Посмотрим результаты

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

Возьмем случайное изображение — картинку с индексом 1010. Берем предсказанную метку (в данном случае — 4, потому что на пятой позиции стоит цифра 1)

array([0., 0., 0., 0., 1., 0., 0., 0., 0., 0.])

Построим изображения соответствующей картинки

Проверка нейронной сети

Понимание вывода активационного слоя softmax

Пропустим цифру через нейронную сеть и посмотрим, какой вывод она предскажет.

Вывод слоя softmax — это распределение вероятностей для каждого вывода. В этом случае их может быть 10 (цифры от 0 до 9). Но ожидается, что каждое изображение будет соответствовать лишь одному.

Поскольку это распределение вероятностей, их сумма приблизительно равна 1 (единице).

Чтение вывода слоя softmax для конкретной цифры

Как можно видеть дальше, 5-ой индекс действительно близок к 1 (0,99), а это значит, что он с большой долей вероятности является
4… а это так и есть!

Просмотр матрицы ошибок

Просмотр матрицы ошибок

Выводы

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

  • Кодировать и декодировать изображения в наборе данных MNIST
  • Кодировать категориальные значения с помощью “one-hot encoding”
  • Определять нейронную сеть с двумя скрытыми слоями, а также слой вывода, использующий функцию активации softmax
  • Изучать результаты вывода функции активации softmax
  • Строить матрицу ошибок классификатора

Библиотеки Sci-Kit Learn и Keras значительно понизили порог входа в машинное обучение — так же, как Python снизил порог знакомства с программированием. Однако потребуются годы (или десятилетия), чтобы достичь экспертного уровня!

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

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

Попробуйте сами

Вот что вы можете попробовать сделать сами, чтобы углубиться в мир машинного обучения с Python:

Узнайте, как построить и обучить многослойный персептрон, используя высокоуровневый API Keras от TensorFlow!

Развитие Keras начал в начале 2015 года. На сегодняшний день он превратился в одну из самых популярных и широко используемых библиотек, построенных на основе Theano а также TensorFlow , Одна из его выдающихся особенностей заключается в том, что он имеет очень интуитивно понятный и удобный API, который позволяет нам внедрять нейронные сети всего в несколько строк кода.

Keras также интегрирован в TensorFlow с версии 1.1.0. Это часть contrib модуль (который содержит пакеты, разработанные авторами TensorFlow и считается экспериментальным кодом).

В этом уроке мы рассмотрим этот высокий уровень TensorFlow API, пройдя через:

  • Основы прямой связи нейронных сетей
  • Загрузка и подготовка популярного набора данных MNIST
  • Создание классификатора изображений
  • Обучите нейронную сеть и оцените ее точность

Этот учебник адаптирован изЧасть 4из следующих технологийМашинное обучение PythonЭта серия статей посвящена алгоритмам машинного обучения и глубокого обучения с Python от 0 до 100. Она включает в себя изолированную среду в браузере со всем необходимым программным обеспечением и предустановленными библиотеками, а также проекты с использованием общедоступных наборов данных. Вы можете начать бесплатноВот!

Многослойные нейронные сети с прямой связью - это особый типполностью подключенсеть с несколькими одиночными нейронами. Их также называютМногослойные персептроны(MLP). На следующем рисунке показана концепция MLP, состоящая из трех уровней:

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

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

Как показано на предыдущем рисунке, мы обозначаемяй блок активации вяй слой какa_i ^ (л).Чтобы сделать математические и кодовые реализации более понятными, мы будем использоватьвверхний индекс для входного слоя,часверхний индекс для скрытого слоя, аоверхний индекс для выходного слоя.

Например,a_i ^ (в)Относится кяth значение во входном слое,a_i ^ (ч)Относится кяй блок в скрытом слое, иa_i ^ (уходит)Относится кяй блок в выходном слое. Здесь активация блоковA_0 ^ (в)а такжеA_0 ^ (уходит)Являютсяединицы смещения, который мы устанавливаем равным1, Активация единиц на входном слое - это просто его вход плюс единица смещения:


Каждый блок в слоеLсвязан со всеми единицами в слоел + 1через весовой коэффициент. Например, связь междуКй блок в слоеLкJй блок в слоел + 1будет написано какw_ ^ (л), Возвращаясь к предыдущему рисунку, мы обозначим весовую матрицу, которая соединяет вход со скрытым слоем, какШ ^ (з)И мы записываем матрицу, которая соединяет скрытый слой с выходным слоем в видеW ^ (уходит),

Суммируем веса, которые соединяют входной и скрытый слои с помощью матрицы:


гдеdколичество скрытых единиц имколичество входных единиц, включая единицу смещения. Поскольку важно усвоить эту нотацию, чтобы следовать концепциям, приведенным далее в этом учебном пособии, давайте подведем итог тому, что мы только что узнали, в описательной иллюстрации упрощенного 3–4–3 многослойного персептрона:

Чтобы увидеть, что обучение нейронной сети через tensorflow.keras ( tf.keras ) высокоуровневый API выглядит так: давайте реализуем многослойный персептрон для классификации рукописных цифр из популярного Смешанного национального института стандартов и технологий (MNIST) набор данных, который служит популярным эталонным набором данных для алгоритма машинного обучения.

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

Набор данных MNIST из четырех частей, как указано здесь:

  • Учебный набор изображений: train-images-idx3-ubyte.gz - 60000 образцов
  • Учебный набор этикеток: train-labels-idx1-ubyte.gz - 60000 этикеток
  • Тестовый набор изображений: t10k-images-idx3-ubyte.gz - 10000 образцов
  • Тестовые наборы этикеток: t10k-labels-idx1-ubyte.gz - 10000 этикеток

Учебный набор состоит из рукописных цифр от 250 разных людей (50% старшеклассников, 50% сотрудников Бюро переписей). Тестовый набор содержит рукописные цифры от разных людей

Обратите внимание, что TensorFlow также предоставляет тот же набор данных, как указано ниже:

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

Первый шаг - разархивировать четыре части набора данных MNIST, выполнив следующие команды в своем терминале:

load_mnist функция возвращает два массива, первый из которых являетсян х ммерная NumPy массив ( images ), гдеNэто количество образцов имколичество объектов (здесь, в пикселях). Изображения в наборе данных MNIST состоят из 28 x 28 пикселей, и каждый пиксель представлен значением интенсивности серой шкалы. Здесь мы развернем 28 x 28 пикселей в одномерные векторы строк, которые представляют строки в нашем images массив (784 на строку или изображение). Второй массив ( labels возвращено load_mnist Функция содержит соответствующую целевую переменную, метки классов (целые числа 0-9) рукописных цифр.

Затем набор данных загружается и подготавливается следующим образом:

Чтобы получить представление о том, как выглядят эти изображения в MNIST, давайте наглядно представим примеры цифр 0–9 с помощью Matplotlib. imshow функция:

Теперь мы должны увидеть график 2 x 5 подфигур, показывающий репрезентативное изображение каждой уникальной цифры:

Теперь давайте начнем строить нашу модель!

Во-первых, давайте установим случайное семя для NumPy а также TensorFlow так что мы получаем последовательные результаты:

Чтобы продолжить подготовку обучающих данных, нам нужно преобразовать метки классов (целые числа 0–9) в формат «один горячий». К счастью, Keras предоставляет удобный инструмент для этого:

Теперь давайте реализуем нашу нейронную сеть! Вкратце, у нас будет три слоя, где первые два слоя (входной и скрытый слои) имеют по 50 единиц с tanh Функция активации и последний слой (выходной слой) имеет 10 слоев для 10 меток классов и использует softmax дать вероятность каждого класса. Keras делает эти задачи очень простыми:

Сначала мы инициализируем новую модель, используя Sequential класс для реализации прямой нейронной сети. Затем мы можем добавить к нему столько слоев, сколько захотим. Однако, поскольку первый слой, который мы добавляем, является входным слоем, мы должны убедиться, что input_dim Атрибут соответствует количеству объектов (столбцов) в обучающем наборе (784 объекта или пикселя в реализации нейронной сети).

Кроме того, мы должны убедиться, что количество выходных единиц ( units ) и единицы ввода ( input_dim ) из двух последовательных слоев совпадают. Наши первые два слоя имеют 50 единиц плюс одна единица смещения каждый. Количество единиц в выходном слое должно быть равно количеству уникальных меток классов - количеству столбцов в массиве меток классов с горячим кодированием.

Обратите внимание, что мы использовали glorot_uniform в качестве алгоритма инициализации весовых матриц.Glorot инициализацияэто более надежный способ инициализации для глубоких нейронных сетей. Смещения инициализируются до нуля, что является более распространенным, и фактически настройка по умолчанию в Keras ,

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

Бинарная кросс-энтропия - это просто технический термин для функции стоимости в логистической регрессии, а категориальная кросс-энтропия - это ее обобщение для мультиклассовых предсказаний черезSoftMax,

После компиляции модели мы можем теперь обучить ее, вызвав fit метод. Здесь мы используем мини-пакетный стохастический градиент с размером партии 64 тренировочных образца на партию. Мы обучаем MLP более 50 эпох, и мы можем следить за оптимизацией функции стоимости во время обучения, устанавливая verbose=1 ,

validation_split Параметр особенно удобен, так как он будет резервировать 10% обучающих данных (здесь 6000 выборок) для проверки после каждой эпохи, чтобы мы могли отслеживать, подходит ли модель во время обучения:

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

Чтобы предсказать метки классов, мы можем затем использовать predict_classes метод для возврата меток класса непосредственно в виде целых чисел:

Наконец, давайте напечатаем точность модели на тренировочных и тестовых наборах:

Я надеюсь, вам понравился этот урок по использованию TensorFlow «s keras API для построения и обучения многослойной нейронной сети для классификации изображений! Обратите внимание, что это просто очень простая нейронная сеть без оптимизированных параметров настройки.

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

Мы рассмотрим эти темы в следующих технологияхМашинное обучение Python (часть 4)Конечно, а также:

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

Лучший способ понять цель этой статьи — взглянуть на демонстрационную программу на рис. 1. Это классическое приложение Windows Forms. Кнопка с меткой Load Images считывает в память стандартный набор данных для распознавания изображений, называемый набором данных MNIST. Он состоит из 60 000 написанных от руки цифр в диапазоне 0–9, которые потом были оцифрованы. Демонстрационная программа позволяет отображать текущее выбранное изображение как растровое (в левой части рис. 1) и как матрицу значений пикселей в шестнадцатеричной форме (в правой части).

Отображение изображений MNIST


Рис. 1. Отображение изображений MNIST

Терминология, используемая в литературе по IR, весьма заметно варьируется. Распознавание изображений может называться классификацией изображений, распознаванием шаблонов, сравнением шаблонов (pattern matching) или классификацией шаблонов. Хотя эти термины на самом деле имеют разный смысл, иногда они употребляются как взаимозаменяемые, что несколько затрудняет поиск релевантной информации в Интернете.

Набор данных MNIST

Смешанный набор данных Национального института стандартов и технологий (mixed National Institute of Standards and Technology, MNIST) был создан исследователями IR в качестве эталона для сравнения различных алгоритмов IR. Основная идея в том, что, если у вас есть какой-то алгоритм или программная система IR, которую надо протестировать, вы можете запустить свой алгоритм или систему с использованием набора данных MNIST и сравнить результаты с ранее опубликованными для других систем.

Набор данных состоит всего из 70 000 изображений: 60 000 обучающих (используемых для создания модели IR) и 10 000 тестовых (применяемых для оценки точности модели). Каждое изображение MNIST — это оцифрованная картинка одной цифры, написанной от руки. Каждое изображение имеет размер 28 × 28 пикселей. Каждое значение пикселя лежит в диапазоне от 0 (представляет белый цвет) до 255 (представляет черный цвет). Промежуточные значения отражают оттенки серого. На рис. 2 показаны первые восемь изображений в обучающем наборе. Сама цифра, которая соответствует каждому изображению, очевидна человеку, но для компьютеров идентификация цифр — очень сложная задача.

Первые восемь обучающих изображений MNIST


Рис. 2. Первые восемь обучающих изображений MNIST

Любопытно, что и обучающие, и тестовые данные хранятся в двух файлах, а не в одном. Один файл содержит значения пикселей для изображений, а другой — метки изображений (0–9). Каждый из четырех файлов также содержит заголовочную информацию, и все они хранятся в двоичном формате, сжатом в формате gzip.

Создание средства просмотра MNIST

После загрузки кода шаблона в редактор Visual Studio я подготовил UI. Я добавил два элемента управления TextBox (textBox1, textBox2) для хранения путей к двум распакованным файлам с обучающими данными, элемент управления Button (button1) с меткой Load Images, а также еще два TextBox (textBox3, textBox4) для хранения индексов текущего и следующего изображений. С помощью дизайнера Visual Studio я настроил начальные значения для этих элементов управления как «NA» и «0» соответственно.

Разместив эти UI-элементы на Windows-форме, я добавил три поля, видимых только в пределах класса:

Первые две строки указывают местоположение распакованных файлов с обучающими данными. Для запуска демонстрационной программы вам придется отредактировать эти две строки. Третье поле — это массив определенных в программе объектов DigitImage.

Я слегка изменил конструктор Form, чтобы поместить файловые пути в textBox1 и textBox2 и задать для масштабирования начальное значение 6:

Свойство ActiveControl указывает, что изначально фокус ввода помещается на элемент управления button1; это сделано просто для удобства.

Создание класса для хранения изображения MNIST

Я создал небольшой класс-контейнер, представляющий одно изображение MNIST (рис. 3), и назвал его DigitImage, но вы можете переименовать его в нечто более специфическое, например MnistImage.

Рис. 3. Определение класса DigitImage

Конструктор класса DigitImage принимает параметры width, height, pixels (матрицу) и label и просто копирует значения этих параметров в соответствующие поля. Я мог бы копировать pixels по ссылке, а не по значению, но это могло бы привести к нежелательным побочным эффектам при изменении значений исходной матрицы пикселей.

Загрузка данных MNIST

Для регистрации обработчика события кнопки button1 я просто дважды щелкаю ее. Этот обработчик большую часть работы отдает методу LoadData:

Рис. 4. Метод LoadData

Формат файла обучающих пиксельных данных MNIST имеет начальное магическое целочисленное значение (32 бита), равное 2051, за которым следует количество изображений (целочисленное значение), затем количество строк и количество столбцов (целочисленные значения), потом 60 000 изображений по 28 × 28 пикселей = 47 040 000 байтовых значений. Поэтому после открытия двоичных файлов первые четыре целочисленных значения считываются методом ReadInt32. Например, количество изображений считывается так:

Любопытно, что файлы MNIST хранят целочисленные значение в «тупоконечном» формате (big endian format) (с обратным порядком байтов), используемым некоторыми процессорами, отличными от Intel, а не в более привычном «остроконечном» формате (little endian format), наиболее распространенном на аппаратном обеспечении, на котором работает программное обеспечение Microsoft. Поэтому, если вы используете обычное оборудование в стиле ПК, для просмотра или использования любого из этих целочисленных значений нужно сначала выполнить преобразование из «тупоконечного» в «остроконечный» формат. Под этим подразумевается смена порядка четырех байтов, образующих целое значение. Например, магическое число 2051 в «тупоконечной» форме:

И то же самое, но в привычной «остроконечной» форме:

Метод LoadData считывает, но не использует заголовочную информацию. Вероятно, вы захотите проверить эти четыре значения (2051, 60000, 28, 28), чтобы убедиться, что файл не поврежден. После открытия обоих файлов и чтения целых чисел из заголовка LoadData считывает 28 * 28 = 784 последовательных пиксельных значений из файла с пиксельными данными и сохраняет их, а затем считывает одно маркерное значение из файла с маркерными данными и объединяет его с пиксельными значениями в объект DigitImage, который потом сохраняется в массив trainData, видимый на уровне класса. Обратите внимание на отсутствие явного идентификатора изображения. У каждого изображения есть неявный идентификатор индекса (index ID), который указывает позицию изображения (с отсчетом от 0) в последовательности изображений.

Показ изображения

Дважды щелкнув элемент управления button2, я регистрирую его обработчик событий. Код для вывода изображения приведен на рис. 5.

Рис. 5. Показ изображения MNIST

Рис. 6. Метод MakeBitmap

Метод короткий, но не простой. Конструктор Bitmap принимает ширину и высоту как целочисленные значения, которые для базовых данных MNIST всегда равны 28 и 28. Если коэффициент масштабирования равен 3, изображение Bitmap будет размером (28 * 3) × (28 * 3) = 84 × 84 пикселя, и каждый квадрат 3 × 3 в Bitmap будет представлять один пиксел исходного изображения.

Передача значений для объекта Bitmap осуществляется неявно, через объект Graphics. Во вложенном цикле значение текущего пикселя дополняется значением 255, чтобы конечное изображение было черной или серой цифрой на белом фоне. Без такого дополнения изображение было бы белой или серой цифрой на черном фоне. Для создания оттенков серого те же значения для параметров red, green и blue передаются методу FromArgb. Альтернатива — передавать значения пикселя только одному из RGB-параметров, чтобы получить цветное изображение (оттенки красного, зеленого или синего) вместо черно-белого с оттенками серого.

Метод FillRectangle рисует область для объекта Bitmap. Первый параметр — цвет. Второй и третий — x- и y-координаты верхнего левого угла прямоугольника. Заметьте, что значения x увеличиваются сверху вниз, что соответствует индексу j в пиксельной матрице исходного изображения. Четвертый и пятый параметры метода FillRectangle являются шириной и высотой прямоугольной области для рисования, начиная от угла, указанного вторым и третьим параметрами.

Например, текущий пиксел, который надо показать, находится по i = 2 и j = 5 в исходном изображении и имеет value = 200 (представляет темно-серый цвет). Если коэффициент масштабирования установлен в 3, объект Bitmap будет изображением с размером 84 × 84 пикселя. Метод FillRectangle начнет рисовать с x = (5 * 3) = столбец 15 и y = (2 * 3) = строка 6 в Bitmap и создаст прямоугольник 3 × 3 пикселя с темно-серым цветом — (55,55,55).

Отображение значений пикселей изображения

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

Он конструирует одну длинную строку со встроенными символами перевода каретки, используя конкатенацию строк для простоты. Когда эта строка помещается в элемент управления TextBox, свойство Multiline которого установлено в True, строка будет показываться, как на рис. 1. Хотя шестнадцатеричные значения могут оказаться труднее в интерпретации, чем десятичные, они форматируются корректнее..

Куда двигаться дальше?

Распознавание изображений (IR) — задача концептуально простая, но крайне трудная в реализации на практике. Первый шаг в понимании IR — визуализация общеизвестного набора данных MNIST, как показано в этой статье. Если вы взглянете на рис. 1, то увидите, что изображение MNIST — это на самом деле не что иное, как 784 значения с сопоставленным маркером, например «4». Поэтому распознавание изображения сводится к поиску некоей функции, которая принимает 784 значения как ввод и возвращает (как вывод) 10 сходимостей по вероятностям, представляющих возможности того, что ввод — это цифры от 0 до 9 соответственно.

Распространенный подход к IR — применение той или ной формы нейронной сети. Например, вы могли бы создать нейронную сеть с 784 входными узлами, скрытым уровнем из 1000 узлов и выходным уровнем с 10 узлами. В такой сети нужно было бы определить итого (784 * 1000) + (1000 * 10) + (1000 + 10) = 795 010 весовых значений и смещений. Даже при наличии 60 000 обучающих изображений это было бы крайне трудной задачей. Но есть несколько потрясающий методологий, помогающих получить хорошее средство распознавания изображений. Эти методологии включают использование сверточной нейронной сети (convolutional neural network) и генерацию дополнительных обучающих изображений с применением упругой деформации (elastic distortion).

Выражаю благодарность за рецензирование статьи экспертам Microsoft Research Волфу Кинцле (Wolf Kienzle).

Я создал простую функцию для facerecognition, используя facerecognizer из OpenCV. Он отлично работает с изображениями людей.

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

Мне просто нужно извлечь несколько изображений из:

и сохраните их в папке как .jpg

Или я не понимаю, что это MNIST. Если да, где я могу получить такой набор данных?

ИЗМЕНИТЬ

У меня также есть файл gzip:

Я пытаюсь прочитать содержимое, но show() не работает, и если я read() , я вижу случайные символы.

ИЗМЕНИТЬ

Удалось получить полезный вывод с помощью:

Как-то мне нужно преобразовать это сейчас в изображение, вывод:

введите описание изображения здесь

Загрузите обучающие/тестовые изображения и ярлыки:

    train-images-idx3-ubyte.gz: обучающий набор изображений train-tags-idx1-ubyte.gz: ярлыки обучающего набора t10k-images-idx3-ubyte.gz: тестовый набор изображений t10k-tags-idx1-ubyte.gz: тестовый набор меток

И распакуйте их в рабочий каталог, скажем, samples/ .

Получить пакет python-mnist от PyPi:

Импортируйте пакет mnist и прочитайте обучающие/тестовые изображения:

Чтобы отобразить изображение на консоли:

Вы получите что-то вроде этого:

    Каждое изображение списка изображений представляет собой list Python без знака байтов. Ярлыки представляют собой array Python-байтов без знака.

(Используя только matplotlib, gzip и numpy)
Извлечь данные изображения:

enter image description here

Напечатайте первые 100 этикеток:

Используйте это для извлечения базы данных mnist для изображений и ярлыков csv в python:

Вы действительно можете использовать пакет idx2numpy, доступный на PyPI. Он чрезвычайно прост в использовании и напрямую преобразует данные в массивы. Вот что вы должны сделать:

Загрузка данных

Загрузите набор данных MNIST с официального сайта.
Если вы используете Linux, вы можете использовать wget, чтобы получить его из командной строки. Просто беги:

Распаковка данных

Распакуйте или распакуйте данные. В Linux вы можете использовать gzip

В конечном итоге у вас должны быть следующие файлы:

Префикс data/ только потому, что я извлек их в папку с именем data . Ваш вопрос выглядит так, как будто вы все сделали до сих пор, так что продолжайте читать.

Использование idx2numpy

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

Теперь вы можете использовать его с OpenCV Juts таким же образом, как вы отображаете любое другое изображение, используя что-то вроде

Чтобы установить idx2numpy, вы можете использовать PyPI (менеджер пакетов pip ). Просто запустите команду:

Читайте также: