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

Эта статья о том, как обучить модель классификации изображений с помощью TensorFlow. Для этой цели я буду использовать набор данных MNIST, который содержит изображения цифр от 0 до 9. Цель этой модели — классифицировать изображения по соответствующим числовым меткам.

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

Для начала импортируйте все необходимые библиотеки, начиная с TensorFlow, до категориальных (для категоризации числовых значений классов), Sequential, Flatten, Dense и Dropout.

import tensorflow as tf
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense, Dropout

Гиперпараметры

Перед проектированием сети нам необходимо определиться с набором гиперпараметров сети.

  1. Был выбран размер мини-партии 128 штук. Размер пакета может быть любым, но степень двойки эффективна с точки зрения использования памяти и поэтому является предпочтительным вариантом. Еще одна причина для выбора подходящего размера пакета: очень маленький размер пакета может сильно зашумить сходимость, а очень большой размер пакета не поместится в памяти вашего компьютера.
  2. Поскольку размер набора данных, который мы здесь используем, невелик, число эпох, равное 50, было бы хорошо для быстрого обучения модели.
  3. Скорость обучения может быть установлена ​​на любое значение, но для этой модели я устанавливаю ее на 0,01.
  4. Мы можем экспериментировать с любым количеством нейронов, например, 64, 32 и т. д., но здесь мы установили два скрытых слоя по 128 нейронов в каждом. Более высокие значения не рекомендуются для небольшого и простого набора данных, такого как MINST.
  5. Другие гиперпараметры, такие как шаги затухания и скорость затухания, которые помогают снизить скорость обучения по мере обучения, установлены на 2000, 0,9 соответственно.
  6. Наконец, из множества доступных оптимизаторов здесь я выбираю adamax.
params = {
    'dropout': 0.25,
    'batch-size': 128,
    'epochs': 50,
    'layer-1-size': 128,
    'layer-2-size': 128,
    'initial-lr': 0.01,
    'decay-steps': 2000,
    'decay-rate': 0.9,
    'optimizer': 'adamax'
}

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

Важно понимать, как спроектировать нейронную сеть.

  1. Здесь, поскольку мы используем DNN (глубокую нейронную сеть), нам сначала нужно добавить слой Flatten(), чтобы он мог векторизовать наше 2D-изображение. Количество входных параметров равно длине вектора.
  2. Затем добавляются два скрытых плотных слоя с помощью метода Dense(), который получает гиперпараметры из ранее определенного словаря «params». Использование «relu» — выпрямленной линейной единицы, одной из наиболее часто используемых функций активации в скрытых слоях нейронной сети — в качестве функции активации для этих слоев.
  3. Далее добавляем выпадающий слой с помощью метода Dropout(). Он используется для предотвращения переобучения при обучении сети. Модель, которая подгоняет, запоминает обучающие данные и не сможет хорошо обобщить невидимые данные.
  4. Наконец, выходной слой, определенный с помощью метода Dense(), содержит 10 нейронов, соответствующих 10 цифрам.
model = Sequential([
  Flatten(input_shape=(784, )),
  Dense(params('layer-1-size'), activation='relu'),
  Dense(params('layer-2-size'), activation='relu'),
  Dropout(params('dropout')),
  Dense(10)
  ])

lr_schedule = 
    tf.keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate=experiment.get_parameter('initial-lr'),
    decay_steps=experiment.get_parameter('decay-steps'),
    decay_rate=experiment.get_parameter('decay-rate')
    )

loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)

model.compile(optimizer='adamax', 
              loss=loss_fn,
              metrics=['accuracy'])

model.fit(x_train, y_train,
    batch_size=experiment.get_parameter('batch-size'),
    epochs=experiment.get_parameter('epochs'),
    validation_data=(x_test, y_test),)
  1. Используется планировщик скорости обучения, который экспоненциально снижает скорость обучения с начальной скоростью обучения, шагами затухания и скоростью затухания в качестве параметров.
  2. Использовал CategoricalCrossentropy в качестве функции потерь в этой задаче классификации нескольких классов.
  3. Скомпилирована модель с использованием оптимизатора (adamax), функции потерь и метрик (точность).
  4. Вызвал метод подгонки с x_train, y_train, batch_size, эпохами и validation_data.
  5. Наконец, мы можем оценить производительность модели на невидимых тестовых данных, используя model.evaluate().
score = model.evaluate(x_test, y_test)
print(score)

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