Предотвратете пренастройването и повишете точността на вашия модел за машинно обучение чрез прилагане на методите за увеличаване на данните на TensorFlow.

Увеличаването на данни е процес на прилагане на различни трансформации към данните за обучение. Той помага да се увеличи разнообразието на набора от данни и да се предотврати пренастройването. Пренастройването се случва най-вече, когато имате ограничени данни за обучение на вашия модел.

Тук ще научите как да използвате модула за увеличаване на данни на TensorFlow, за да разнообразите своя набор от данни. Това ще предотврати пренастройването чрез генериране на нови точки от данни, които са малко по-различни от оригиналните данни.

Примерният набор от данни, който ще използвате

Ще използвате набора от данни за котки и кучета Kaggle. Този набор от данни съдържа приблизително 3000 изображения на котки и кучета. Тези изображения са разделени на комплекти за обучение, тестване и валидиране.

Етикетът 1.0 представлява куче, докато етикетът 0.0 представлява котка.

instagram viewer

Пълният изходен код, прилагащ техники за разширяване на данни, и този, който не е достъпен в a GitHub хранилище.

Инсталиране и импортиране на TensorFlow

За да продължите, трябва да имате a основно разбиране на Python. Трябва също да имате основни познания за машинно обучение. Ако имате нужда от опресняване, може да помислите да следвате някои уроци по машинно обучение.

Отворете Google Colab. Променете типа време на изпълнение на GPU. След това изпълнете следната магическа команда в първата кодова клетка, за да инсталирате TensorFlow във вашата среда.

!pip инсталира tensorflow

Импортирайте TensorFlow и съответните му модули и класове.

импортиране тензорен поток като tf
от tensorflow.keras.preprocessing.image импортиране ImageDataGenerator
от tensorflow.keras.models импортиране Последователен
от tensorflow.keras.layers импортиране Conv2D, MaxPooling2D, Flatten, Dense, Dropout

The tensorflow.keras.preprocessing.image ще ви позволи да извършите увеличаване на данните на вашия набор от данни.

Създаване на екземпляри на класа ImageDataGenerator

Създайте екземпляр на ImageDataGenerator клас за данните за влака. Ще използвате този обект за предварителна обработка на данните за обучение. Той ще генерира партиди от разширени данни за изображение в реално време по време на обучението на модела.

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

# дефинирайте генератора на данни за изображение за обучение
train_datagen = ImageDataGenerator (rescale=1./255,
хоризонтално_обръщане=Вярно,
width_shift_range=0.2,
диапазон_отместване_на_височина=0.2,
обхват_яркост=[0.2,1.0],
zoom_range=0.2)

Създайте друг екземпляр на ImageDataGenerator клас за тестовите данни. Ще имате нужда от повторно мащабиране параметър. Той ще нормализира стойностите на пикселите на тестовите изображения, за да съответстват на формата, използван по време на обучението.

# дефинирайте генератора на данни за изображение за тестване
test_datagen = ImageDataGenerator (премащабиране=1./255)

Създайте последен екземпляр на ImageDataGenerator клас за данните за валидиране. Премащабирайте данните за валидиране по същия начин като данните от теста.

# дефинирайте генератора на данни за изображение за валидиране
validation_datagen = ImageDataGenerator (rescale=1./255)

Не е необходимо да прилагате другите техники за увеличаване към данните за теста и валидирането. Това е така, защото моделът използва данните от теста и валидирането само за целите на оценката. Те трябва да отразяват първоначалното разпределение на данните.

Вашите данни се зареждат

Създавам Итератор на директория обект от справочника за обучение. Той ще генерира партиди от разширени изображения. След това посочете директорията, която съхранява данните за обучението. Преоразмерете изображенията до фиксиран размер от 64x64 пиксели. Посочете броя на изображенията, които всяка партида ще използва. И накрая, посочете вида на етикета, който да бъде двоичен (т.е. котка или куче).

# дефиниране на директорията за обучение
train_data = train_datagen.flow_from_directory (директория=r'/content/drive/MyDrive/cats_and_dogs_filtered/train',
target_size=(64, 64),
партиден_размер=32,
class_mode="двоичен")

Създайте друг Итератор на директория обект от директорията за тестване. Задайте параметрите на същите стойности като тези на данните за обучение.

# дефиниране на директорията за тестване
test_data = test_datagen.flow_from_directory (директория='/content/drive/MyDrive/cats_and_dogs_filtered/test',
target_size=(64, 64),
партиден_размер=32,
class_mode="двоичен")

Създайте финал Итератор на директория обект от директорията за валидиране. Параметрите остават същите като тези от данните за обучение и тестване.

# дефиниране на директорията за валидиране
validation_data = validation_datagen.flow_from_directory (директория='/content/drive/MyDrive/cats_and_dogs_filtered/validation',
target_size=(64, 64),
партиден_размер=32,
class_mode="двоичен")

Итераторите на директорията не допълват наборите от данни за валидиране и тестване.

Дефиниране на вашия модел

Определете архитектурата на вашата невронна мрежа. Използвай Конволюционна невронна мрежа (CNN). CNN са проектирани да разпознават модели и характеристики в изображенията.

модел = Sequential()

# конволюционен слой с 32 филтъра с размер 3x3
model.add (Conv2D(32, (3, 3), активиране="relu", input_shape=(64, 64, 3)))

# максимален обединяващ слой с размер на пула 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))

# конволюционен слой с 64 филтъра с размер 3x3
model.add (Conv2D(64, (3, 3), активиране="relu"))

# максимален обединяващ слой с размер на пула 2x2
model.add (MaxPooling2D(pool_size=(2, 2)))

# изравняване на изхода от конволюционните и обединяващите слоеве
model.add (Flatten())

# напълно свързан слой със 128 единици и ReLU активиране
model.add (Плътен(128, активиране="relu"))

# произволно изпуснете 50% от единиците, за да предотвратите прекомерното оборудване
model.add (Отпадане(0.5))

# изходен слой със сигмоидно активиране (двоична класификация)
model.add (Плътен(1, активиране="сигмоид"))

Компилирайте модела, като използвате двоичния файл кръстосана ентропия загуба функция. Проблемите с двоичната класификация обикновено използват It. За оптимизатора използвайте Адам оптимизатор. Това е адаптивен алгоритъм за оптимизиране на скоростта на обучение. И накрая, оценете модела по отношение на точността.

model.compile (загуба='binary_crossentropy', оптимизатор="адам", показатели=["точност"])

Отпечатайте резюме на архитектурата на модела в конзолата.

model.summary()

Следващата екранна снимка показва визуализацията на архитектурата на модела.

Това ви дава общ преглед на това как изглежда дизайнът на вашия модел.

Обучение на вашия модел

Обучете модела с помощта на годни () метод. Задайте броя на стъпките за епоха да бъде броят на тренировъчните проби, разделен на партиден_размер. Освен това задайте данните за валидиране и броя на стъпките за валидиране.

# Обучете модела върху данните за обучение
история = model.fit (тран_данни,
steps_per_epoch=train_data.n // train_data.batch_size,
епохи=50,
validation_data=валидационни_данни,
validation_steps=validation_data.n // validation_data.batch_size)

The ImageDataGenerator клас прилага увеличаване на данните към данните за обучение в реално време. Това прави процеса на обучение на модела по-бавен.

Оценяване на вашия модел

Оценете ефективността на вашия модел върху данните от теста, като използвате оценявам () метод. Освен това отпечатайте загубата и точността на теста на конзолата.

test_loss, test_acc = model.evaluate (test_data,
steps=test_data.n // test_data.batch_size)
печат (загуба на тест: {test_loss}')
печат (точност на теста: {test_acc}')

Следващата екранна снимка показва производителността на модела.

Моделът се представя сравнително добре при никога невиждани данни.

Когато изпълнявате код, който не прилага техниките за увеличаване на данни, точността на обучението на модела е 1. Което означава, че прекалява. Той също така се представя лошо на данни, които никога не е виждал преди. Това е така, защото научава особеностите на набора от данни.

Кога увеличаването на данните не е полезно?

  • Когато наборът от данни вече е разнообразен и голям: Увеличаването на данни увеличава размера и разнообразието на набор от данни. Ако наборът от данни вече е голям и разнообразен, увеличаването на данните няма да е полезно.
  • Когато наборът от данни е твърде малък: Увеличаването на данни не може да създава нови функции, които не присъстват в оригиналния набор от данни. Следователно не може да компенсира малък набор от данни, в който липсват повечето функции, които моделът изисква да научи.
  • Когато типът на увеличаване на данните е неподходящ: Например въртящите се изображения може да не са полезни, когато ориентацията на обектите е важна.

На какво е способен TensorFlow

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