В очень раннем возрасте люди начинают учиться распознавать и обозначать изображения. Теперь, благодаря развитию алгоритмов машинного обучения и глубокого обучения, компьютеры способны классифицировать фотографии в масштабе и с чрезвычайно высокой точностью. Для таких сложных алгоритмов существует множество применений, но некоторые из наиболее популярных включают распознавание лиц на мобильных устройствах, идентификацию здоровых легких и классификацию товаров для розничной торговли.
Эта статья о том, как обучить модель классификации изображений с помощью 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
Гиперпараметры
Перед проектированием сети нам необходимо определиться с набором гиперпараметров сети.
- Был выбран размер мини-партии 128 штук. Размер пакета может быть любым, но степень двойки эффективна с точки зрения использования памяти и поэтому является предпочтительным вариантом. Еще одна причина для выбора подходящего размера пакета: очень маленький размер пакета может сильно зашумить сходимость, а очень большой размер пакета не поместится в памяти вашего компьютера.
- Поскольку размер набора данных, который мы здесь используем, невелик, число эпох, равное 50, было бы хорошо для быстрого обучения модели.
- Скорость обучения может быть установлена на любое значение, но для этой модели я устанавливаю ее на 0,01.
- Мы можем экспериментировать с любым количеством нейронов, например, 64, 32 и т. д., но здесь мы установили два скрытых слоя по 128 нейронов в каждом. Более высокие значения не рекомендуются для небольшого и простого набора данных, такого как MINST.
- Другие гиперпараметры, такие как шаги затухания и скорость затухания, которые помогают снизить скорость обучения по мере обучения, установлены на 2000, 0,9 соответственно.
- Наконец, из множества доступных оптимизаторов здесь я выбираю 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' }
Проектирование нейронной сети
Важно понимать, как спроектировать нейронную сеть.
- Здесь, поскольку мы используем DNN (глубокую нейронную сеть), нам сначала нужно добавить слой Flatten(), чтобы он мог векторизовать наше 2D-изображение. Количество входных параметров равно длине вектора.
- Затем добавляются два скрытых плотных слоя с помощью метода Dense(), который получает гиперпараметры из ранее определенного словаря «params». Использование «relu» — выпрямленной линейной единицы, одной из наиболее часто используемых функций активации в скрытых слоях нейронной сети — в качестве функции активации для этих слоев.
- Далее добавляем выпадающий слой с помощью метода Dropout(). Он используется для предотвращения переобучения при обучении сети. Модель, которая подгоняет, запоминает обучающие данные и не сможет хорошо обобщить невидимые данные.
- Наконец, выходной слой, определенный с помощью метода 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),)
- Используется планировщик скорости обучения, который экспоненциально снижает скорость обучения с начальной скоростью обучения, шагами затухания и скоростью затухания в качестве параметров.
- Использовал CategoricalCrossentropy в качестве функции потерь в этой задаче классификации нескольких классов.
- Скомпилирована модель с использованием оптимизатора (adamax), функции потерь и метрик (точность).
- Вызвал метод подгонки с x_train, y_train, batch_size, эпохами и validation_data.
- Наконец, мы можем оценить производительность модели на невидимых тестовых данных, используя model.evaluate().
score = model.evaluate(x_test, y_test) print(score)
В этой статье представлен обзор того, как обучить глубокую нейронную сеть для классификации изображений в TF, и ее можно считать хорошей отправной точкой для знакомства с такими задачами с использованием нейронных сетей.