Что такое БЫКИ
Oxen – это инструмент, который позволяет создавать версии наборов данных для машинного обучения так же, как вы версионируете свой код.
Он оптимизирован для быстрой работы с различными типами данных, включая структурированные и неструктурированные данные, такие как изображения, видео, аудио и текст. Интерфейс командной строки Oxen (CLI) похож на git, что упрощает его использование для тех, кто знаком с управлением версиями кода с помощью git.
Чтобы узнать больше об особенностях Oxen, установке и основных командах, перейдите по ссылке.
В этом уроке мы покажем вам, как легко мы можем клонировать наборы данных из репозитория OxenHub и построить алгоритм машинного обучения классификации изображений кошек и собак.
Монтаж
Мак
$ brew tap Oxen-AI/oxen $ brew install oxen
Последняя версия Ubuntu
$ wget https://github.com/Oxen-AI/oxen-release/releases/download/v0.4.8/oxen-ubuntu-latest-0.4.8.deb $ sudo dpkg -i oxen-ubuntu-latest-0.4.8.deb
Настройка пользователя
Чтобы ваша история коммитов отображала вашу информацию точно, вам необходимо настроить локальное имя пользователя и адрес электронной почты Oxen. Это то, что будет отображаться в oxen log
и на панели инструментов OxenHub, чтобы указать, кто внес определенные изменения.
$ oxen config --name "YOUR_NAME" --email "YOUR_EMAIL"
Набор токенов аутентификации для хоста: hub.oxen.ai
$ oxen config --auth hub.oxen.ai 'API Key'
Клонировать репозиторий
$ oxen clone https://hub.oxen.ai/ox/CatDogBoundingBox
После того, как вы клонировали репо, вы должны найти следующие каталоги.
После того, как вы клонируете репозиторий, вам нужно проверить ветку Nurul25kCatDogImages
.
$ oxen checkout -b Nurul25KCatDogImages
Мы рассмотрим руководство по папке Dogs-Vs-Cats и изучим другие каталоги в отдельном посте. Внутри каталога dogs-vs-cats мы найдем 3 следующие папки.
sampleSubmission.csv
тест/
обучение/
Эти наборы данных изначально были собраны с Kaggle, но мы проиндексировали их в репозиторий Oxen, чтобы их было проще использовать, дополнять и расширять с течением времени.
Давайте начнем строить базовую архитектуру CNN для классификации кошек и собак по изображениям.
Прежде всего, давайте импортируем все необходимые библиотеки.
import numpy as np import pandas as pd import seaborn as sns import dtale from tensorflow.keras.utils import load_img from tensorflow.keras.utils import img_to_array from matplotlib.image import imread from numpy import asarray from keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.utils import to_categorical from sklearn.model_selection import train_test_split from tensorflow.python.ops.math_ops import arg_max import matplotlib.pyplot as plt import random import os
Определение размера изображения и пакета.
Image_Width= 224 Image_Height= 224 Image_Size=(Image_Width,Image_Height) Image_Channels=3 batch_size = 32
Теперь нам нужно изучить наборы данных, которые мы собираемся использовать для этого урока. Мы будем работать с 25К изображений, которые есть в папке поезда.
Теперь давайте прочитаем эти изображения и преобразуем их во фрейм данных.
filenames = os.listdir("train") categories = [] for f_name in filenames: category=f_name.split('.')[0] if category=='dog': categories.append(1) else: categories.append(0) df = pd.DataFrame({ 'filename':filenames, 'category':categories })
Если мы распечатаем фрейм данных, мы должны найти:
Теперь мы разделим наборы данных на train_df, test_df, validate_df.
train_df = df.loc[:22000] test_df = df.loc[22001:24000] validate_df = df.loc[24001:24999]
Здесь я сделал разбиение вручную, однако вы можете сделать это с помощью встроенной функции keras.
tf.keras.utils.split_dataset( dataset, left_size=None, right_size=None, shuffle=False, seed=None )
Давайте посмотрим на наборы данных train_df и нарисуем несколько изображений.
plt.figure(figsize=(20,20)) for i in range(2): plt.subplots(1) filename = '/data/NurulWorkspace/dogs-vs-cats/train/'+train_df['filename'][i] image = imread(filename) print('image shape', image .shape, 'maximum color level', image .max()) # plot raw pixel data plt.imshow(image)
Теперь мы найдем, сбалансированы ли наборы данных!
sns.countplot(x ='category', data = train_df)
Мы видим, что наборы данных хорошо сбалансированы, и нам не нужно делать дополнительную аугментацию данных.
Теперь мы создадим генераторы данных для обучения и проверки данных.
# Create data generators for the training and validation data train_datagen = ImageDataGenerator(rotation_range=15, rescale=1./255, shear_range=0.1, zoom_range=0.2, horizontal_flip=True, width_shift_range=0.1, height_shift_range=0.1 ) train_generator = train_datagen.flow_from_dataframe(train_df, "train/",x_col='filename',y_col='category', target_size=Image_Size, class_mode='categorical', batch_size=batch_size) validation_datagen = ImageDataGenerator(rescale=1./255) validation_generator = validation_datagen.flow_from_dataframe( validate_df, "train/", x_col='filename', y_col='category', target_size=Image_Size, class_mode='categorical', batch_size=batch_size ) Found 22001 validated image filenames belonging to 2 classes. Found 999 validated image filenames belonging to 2 classes.
Поскольку мы закончили предварительную обработку данных, пришло время создать базовую архитектуру CNN и обучить модель.
from keras.models import Sequential from keras.layers import Conv2D,MaxPooling2D,\ Dropout,Flatten,Dense,Activation,\ BatchNormalization model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(Image_Width, Image_Height, Image_Channels))) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) # Second convolutional layer model.add(Conv2D(64, (3, 3), activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) # Third convolutional layer model.add(Conv2D(128, (3, 3), activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) # Flatten layer model.add(Flatten()) # Fully connected layer model.add(Dense(512, activation='relu')) model.add(BatchNormalization()) model.add(Dropout(0.5)) model.add(Dense(2, activation='softmax')) # Compile the model model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy']) # Print the model summary model.summary()
epochs= 90 history = model.fit( train_generator, epochs = epochs, validation_data=validation_generator, #callbacks=callbacks )
Сохранение модели[Опция]. Если вы хотите сохранить модель.
model.save("Data_Cats_vs_Dogs_Classification_25K_Images.h5")
Построение кривой точности и потерь для фазы обучения для каждой эпохи.
Похоже, что модель работает разумно на данных поезда. Давайте посмотрим, хорошо ли работает модель с невидимыми или тестовыми наборами данных.
Во-первых, давайте подготовим тестовые наборы данных аналогично шагам обучения.
test_datagen = ImageDataGenerator(rotation_range=15, rescale=1./255, shear_range=0.1, zoom_range=0.2, horizontal_flip=True, width_shift_range=0.1, height_shift_range=0.1) test_generator = train_datagen.flow_from_dataframe(test_df, "train/", x_col= 'filename', y_col='category', target_size=Image_Size, class_mode= 'categorical', shuffle = False, batch_size=batch_size ) Found 2000 validated image filenames belonging to 2 classes.
sns.countplot(x ='category', data = test_df)
Также кажется, что наборы тестовых данных также хорошо сбалансированы.
Теперь мы выясним, насколько хороша производительность на невидимых / тестовых наборах данных, изучив матрицу путаницы.
from sklearn.metrics import classification_report # Generate predictions for the test data predictions = model.predict(test_generator) # Convert the predictions from one-hot encoding to class labels predicted_classes = np.argmax(predictions, axis=1) # Get the true classes of the test data true_classes = test_generator.classes print(classification_report(true_classes, predicted_classes))
Матрица путаницы — это таблица, которая обобщает производительность модели классификации путем сравнения предсказанных и фактических меток классов. .
Матрица путаницы включает в себя точность, полноту и оценку F1 для каждой метки класса, т. е. 0 и 1, а также их соответствующую поддержку. Кроме того, приводятся общая точность, среднее макроэкономическое значение и средневзвешенное значение показателей оценки.
Точность измеряет долю истинно положительных результатов среди случаев, которые модель предсказала как положительные. Для класса 0 точность составляет 0,9, а для класса 1 — 0,95. Отзыв измеряет долю истинных положительных результатов, которые были правильно идентифицированы моделью. Для класса 0 полнота составляет 0,96, а для класса 1 — 0,89. Оценка F1 представляет собой гармоническое среднее значение точности и полноты, и она дает единую оценку, которая уравновешивает обе метрики. Для класса 0 показатель F1 равен 0,93, а для класса 1 — 0,92. Поддержка — это количество экземпляров в каждом классе. Для класса 0 имеется 1036 экземпляров, а для класса 1 — 964 экземпляра. Точность измеряет долю экземпляров, правильно классифицированных моделью. Общая точность модели составляет 0,9.
Подводя итог: мы использовали OxenHub для сверхбыстрого клонирования больших наборов данных на нашу локальную машину и обучили алгоритм CNN отличать собак от кошек.
- Спасибо, что следили за этим постом.
- Ссылка на Jupyter Notebook.
- Не стесняйтесь проверять документацию разработчиков Oxen по адресу https://github.com/Oxen-AI/oxen-release#-oxen.
- Не стесняйтесь создавать учетную запись на https://oxen.ai/register, чтобы вы могли создавать свои собственные репо и сразу же бесплатно клонировать большие наборы данных.
- Если вам нужна дополнительная информация или помощь, свяжитесь со мной. ЛинкедИн. Электронная почта: [email protected], [email protected]