неділя, 30 травня 2021 р.

Підготовка даних для нейронної мережі

Розглянемо на конкретному прикладі деякі особливості роботи з даними, які ще не розбиті на навчальні та тестові групи так як це було вище і які не можна використовувати для навчання нейронної мережі.

Завантажимо набір даних за посиланням. Він складається із трьох типів зображень по 1000 зображень кожного типу, які знаходяться у трьох папках cats , dogs , panda і ці папки самі розміщені у папці animals. Створимо ще одну папку label в якій будемо зберігати бінарні файли міток train_labels, test_labels. Нагадаємо, що з такими файлами ми вже працювали коли завантажували набори даних MNIST.

# ініціалізуємо данні і мітки
data = []
labels = []
# Утворюємо список  всіх шляхів до файлів із зображеннями та перемішуємо їх
imagePaths = sort(list(paths.list_images("dog_cat_panda\\animals")))
random.seed(42)
random.shuffle(imagePaths)
# Організовуємо цикл по зображенням
for imagePath in imagePaths:
	# Завантажуємо зображення, змінюємо його розмір до 32 x 32 пікселів, 
	# сплющуємо його  в 32x32x3=3072  пікселі і закидаємо в список
	image = cv2.imread(imagePath)
	image = cv2.resize(image, (32, 32)).flatten()
	data.append(image)
	# витягуємо назву мітки з імені шляху  і закидаємо її в список міток
	label = imagePath.split(os.path.sep)[-2]
	labels.append(label)
Використання os.path.sep зрозуміле із наступних прикладів:
'dog_cat_panda\animals\cats\cats_00003.jpg'.split(os.path.sep)
['dog_cat_panda\x07nimals', 'cats', 'cats_00003.jpg']
 'dog_cat_panda\animals\cats\cats_00003.jpg'.split(os.path.sep)[-2]
'cats'
Cписок зображень перетворюємо в NumPy-масив і нормуємо його. Також список міток перетворюємо в масив.
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels) 
Нарешті розіб'ємо данні на навчальні і тестові у співвідношенні 3:1 використовуючи scikit-learn функцію для розщеплення даних train_test_split:
(trainX, testX, trainY, testY) = train_test_split(data,
	labels, test_size=0.25, random_state=42)
Мітки у нас задані як символи, але Keras працює з мітками заданими у числовому форматі. Тому перетворимо мітки у числа використовуючи scikit-learn клас LabelBinarizer:
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY) 
В результаті отримаємо таку бінаризацію міток
[1, 0, 0] # для  cats
[0, 1, 0] # для dogs
[0, 0, 1] # для panda 
Тепер набір даних частково підготовлений для роботи з нейронною мережею. При подальшій роботі з цими наборами даних, після їхнього завантаження, потрібно уточнити структуру цих даних і виконати необхідну попередню підготовку даних.

Немає коментарів:

Дописати коментар