Создайте и обучите модель Keras, написав менее 50 строк кода.

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

В этой статье описывается проект, который поможет вам освоить основы и быстро освоить их.

Итак, с учетом сказанного, давайте приступим к созданию глубокой нейронной сети для выполнения многоклассовой классификации на рентгенограммах грудной клетки Covid-19.

Данные

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



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

Храните загруженные данные в папке ‘data/’ для удобства.

Давайте приступим к импорту необходимых пакетов:

from tensorflow.keras.layers import Conv2D, Flatten, Dense, MaxPooling2D, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing import image
from tensorflow.keras.callbacks import EarlyStopping
import os

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

image_classification_project/
    classifier.ipynb
    data/
        train/
             normal/
             covid/
             pneumonic/
        valid/
             normal/
             covid/
             pneumonic/
        test/
             normal/
             covid/
             pneumonic/

Теперь мы приступаем к построению нашей модели и импорту наших данных.

Импорт данных

Разверните свою локальную среду или, что еще лучше, записную книжку colab со средой выполнения, установленной на «GPU».

Начнем с определения объектов обучения и тестирования генератора данных:

# Data Generators for some data preprocessing and augmentation
train_datagen = image.ImageDataGenerator(rescale = 1./255,
                shear_range = 0.2,
                zoom_range = 0.2,
                horizontal_flip = True)
test_datagen = image.ImageDataGenerator(rescale = 1./255)

Класс ImageDataGenerator обеспечивает простой способ загрузки, предварительной обработки и дополнения изображений в пакетах для наших задач классификации изображений.

Теперь мы переходим к импорту данных из каталогов, которые мы определили в предыдущем разделе:

# importing data
training_set= train_datagen.flow_from_directory(os.path.join(data, "train"),
     target_size = (128, 128),
     batch_size = 32,
     class_mode='binary')

test_set = test_datagen.flow_from_directory(os.path.join(data, "valid"),
     target_size = (128, 128),
     batch_size = 32,
     class_mode='binary')

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

Вы должны получить следующий вывод при выполнении вышеуказанных строк:

Found 4830 images belonging to 3 classes. 
Found 1039 images belonging to 3 classes.

Теперь мы готовы проверить наши тренировочные индексы.

print(training_set.class_indices, test_set.class_indices)

Вы увидите этот вывод после выполнения:

({'covid': 0, 'normal': 1, 'pneumonia': 2},  {'covid': 0, 'normal': 1, 'pneumonia': 2})

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

Теперь давайте приступим к созданию модели!

Модель

Мы начинаем с объекта Sequential и добавляем слои 2D Convolution с 32 фильтрами (или нейронами) с размером ядра 3x3.

Наша входная форма для каждого изображения должна быть: 128x128 пикселей, а 3 означает, что наши изображения являются RGB.

Мы определяем функцию активации как «ReLU».

# the model
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape = (128, 128, 3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2, 2)))
model.add(Conv2D(32, (3, 3), input_shape = (128, 128, 3), activation = 'relu'))
model.add(Flatten())
model.add(Dense(units = 256, activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(units = 128, activation = 'relu'))
model.add(Dense(units = 3, activation = 'softmax'))
model.compile(optimizer = 'adam', loss =  'sparse_categorical_crossentropy', metrics = ['accuracy'])
model.summary()

Затем мы добавляем слой Pooling(MaxPooling2D), еще один слой свертки и полностью связанный (Dense) слой. Слой Dropout предназначен для того, чтобы наша модель не перестраивалась.

Наш последний слой — это еще один плотный слой, также функционирующий как наш выходной слой, который выводит вероятности 3 классов, которые в сумме дают 1, с помощью функции активации softmax.

Ранняя остановка

Документация Tensorflow описывает раннюю остановку как:

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

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

early_stopping = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=4)

Это обратный вызов, который мы включим на следующем этапе, когда подгоним (или обучим) модель.

Обучение модели

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

# Model training
classifier = model.fit(training_set,
                       batch_size = 128,
                       epochs = 10,
                       validation_data = test_set,
                       callbacks=[early_stopping])

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

Как видите, наш обратный вызов имел необходимый эффект, не перетренировав нашу модель и остановившись на самой 9-й эпохе.

В качестве бонуса теперь вы можете сохранить свою модель с помощью встроенной в Keras встроенной функции сохранения:

model_save_full_path = os.path.join(ROOT, 'saved_models', 'conv2d_version‘data/’acc_79_84')
model.save(model_save_full_path)

Следующие шаги

Спасибо за чтение!

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

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

— Изучите другие показатели, такие как точность, полнота и балл F1, для оценки модели.

— Измерьте, как модель работает с тестовым набором данных.

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

Получите мою БЕСПЛАТНУЮ электронную книгу «От модели к производству здесь», в которой я рассказываю о самом быстром способе создания модели глубокого обучения и развертывания ее в виде API.

Приятного обучения! :)