Lab Report No. 7 on Siamese Networks - Kyiv Polytechnic Institute - 2024 PDF

Document Details

Uploaded by Deleted User

Національний технічний університет України «Київський політехнічний інститут імені Ігоря Сікорського»

2024

Підгорний Б. В.

Tags

siamese networks python programming neural networks image processing

Summary

This document is a lab report on Siamese Networks from the Kyiv Polytechnic Institute. The document includes Python code for the implementation of Siamese Networks. The lab report is prepared by Підгорний Б. В. in 2024.

Full Transcript

# Лабораторна робота №7 ## МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ## НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ ## «КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ СІКОРСЬКОГО» ## ФАКУЛЬТЕТ БІОМЕДИЧНОЇ ІНЖЕНЕРІЇ ## КАФЕДРА БІОМЕДИЧНОЇ КІБЕРНЕТИКИ **з дисципліни «Нейронні мережі»** **на тему: «РОЗРОБКА...

# Лабораторна робота №7 ## МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ ## НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ ## «КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ІМЕНІ ІГОРЯ СІКОРСЬКОГО» ## ФАКУЛЬТЕТ БІОМЕДИЧНОЇ ІНЖЕНЕРІЇ ## КАФЕДРА БІОМЕДИЧНОЇ КІБЕРНЕТИКИ **з дисципліни «Нейронні мережі»** **на тему: «РОЗРОБКА СІАМСЬКОЇ МЕРЕЖІ (SIAMESE NETWORKS)»** **Варіант №9** **Виконав:** **студент гр. БС-22** **Підгорний Б. В.** ## Київ-2024 ## Хід роботи ### 1. Сіамська мережа з регуляризацією та нормалізацією. ```python import gzip import idx2numpy import numpy as np import tensorflow as tf from tensorflow.keras import layers, Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.regularizers import l2 def load_kmnist(): with gzip.open('C:/Users/User/Downloads/kmnist-master/train-images-idx3-ubyte.gz', 'r') as f: x_train = idx2numpy.convert_from_file(f) with gzip.open('C:/Users/User/Downloads/kmnist-master/train-labels-idx1-ubyte.gz', 'r') as f: y_train = idx2numpy.convert_from_file(f) with gzip.open('C:/Users/User/Downloads/kmnist-master/t10k-images-idx3-ubyte.gz', 'r') as f: x_test = idx2numpy.convert_from_file(f) with gzip.open('C:/Users/User/Downloads/kmnist-master/t10k-labels-idx1-ubyte.gz', 'r') as f: y_test = idx2numpy.convert_from_file(f) return (x_train, y_train), (x_test, y_test) (x_train, y_train), (x_test, y_test) = load_kmnist() x_train, x_test = x_train / 255.0, x_test / 255.0 x_train = np.expand_dims(x_train, -1) x_test = np.expand_dims(x_test, -1) def create_pairs(x, y): pairs, labels = [], [] num_classes = len(np.unique(y)) digit_indices = [np.where(y == i)[0] for i in range(num_classes)] for idx1 in range(len(x)): current_image = x[idx1] label = y[idx1] idx2 = np.random.choice(digit_indices[label]) pos_image = x[idx2] pairs += [[current_image, pos_image]] labels += [1] neg_label = (label + np.random.randint(1, num_classes)) % num_classes idx2 = np.random.choice(digit_indices[neg_label]) neg_image = x[idx2] pairs += [[current_image, neg_image]] labels += [0] return np.array(pairs), np.array(labels).astype('float32') train_pairs, train_labels = create_pairs(x_train, y_train) test_pairs, test_labels = create_pairs(x_test, y_test) def create_base_network(input_shape): inputs = tf.keras.Input(shape=input_shape) x = layers.Conv2D(64, (3, 3), activation='relu', kernel_regularizer=l2(1e-4))(inputs) x = layers.BatchNormalization()(x) x = layers.MaxPooling2D()(x) x = layers.Conv2D(128, (3, 3), activation='relu', kernel_regularizer=l2(1e-4))(x) x = layers.BatchNormalization()(x) x = layers.MaxPooling2D()(x) x = layers.Flatten()(x) x = layers.Dense(256, activation='relu', kernel_regularizer=l2(1e-4))(x) x = layers.BatchNormalization()(x) x = layers.Dense(128, activation='relu', kernel_regularizer=l2(1e-4))(x) return Model(inputs, x) input_shape = x_train.shape[1:] base_network = create_base_network(input_shape) input_shape = x_train.shape[1:] input_a = tf.keras.Input(shape=input_shape) input_b = tf.keras.Input(shape=input_shape) processed_a = base_network(input_a) processed_b = base_network(input_b) distance = layers.Lambda(lambda embeddings: tf.math.abs(embeddings[0] - embeddings[1]))([processed_a, processed_b]) outputs = layers.Dense(1, activation='sigmoid')(distance) siamese_network = Model([input_a, input_b], outputs) siamese_network.compile(loss='binary_crossentropy', optimizer=Adam(0.0001), metrics=['accuracy']) siamese_network.fit( [train_pairs[:, 0], train_pairs[:, 1]], train_labels, validation_data=([test_pairs[:, 0], test_pairs[:, 1]], test_labels), batch_size=128, epochs=10 ) ## Результат: ``` ## 2. Інша архітектура базової мережі ```python ``` ## Контрольні питання: 1. Сіамська мережа — це тип нейронної мережі, який складається з двох або більше ідентичних підмереж, що мають однакову архітектуру та спільні ваги. Основними застосуваннями сіамських мереж є задачі, пов'язані з порівнянням зображень або інших даних, такі як перевірка подібності обличчя в системах розпізнавання обличчя, виявлення дублікатів або схожих продуктів на онлайн-платформах, пошук схожих зображень у великих базах даних, а також у задачах зіставлення текстів чи аудіо. 2. Основна відмінність архітектури сіамської мережі від традиційних нейронних мереж полягає в тому, що сіамська мережа складається з двох або більше ідентичних підмереж, які мають однакові ваги та структуру. У традиційних мережах зазвичай існує одна єдина модель, яка обробляє весь вхідний потік даних. У сіамській мережі кожна підмережа отримує окремі входи, але їх ваги спільні, що дозволяє порівнювати об'єкти між собою. 3. Contrastive loss використовується для навчання моделей, таких як сіамські мережі, які повинні оцінювати схожість чи відмінність між парами вхідних об'єктів. Принцип роботи полягає в тому, що для кожної пари зображень визначається, чи є ці зображення схожими або різними. Якщо пара зображень схожа, то модель повинна мінімізувати відстань між їх векторами ознак, а якщо різна — максимізувати цю відстань. 4. Принцип роботи triplet loss полягає в тому, що для кожного тренувального прикладу використовуються три об'єкти: анкера, позитивний приклад і негативний приклад. Відмінність між triplet loss i contrastive loss полягає в тому, що contrastive loss працює з парами об'єктів, оцінюючи лише схожість або відмінність між двома об'єктами, тоді як triplet loss використовує тріади, де необхідно враховувати відстані між трьома об'єктами одночасно. 5. Основні етапи підготовки даних для навчання сіамської мережі включають кілька ключових кроків. Першим етапом є збори та попередня обробка даних, де необхідно привести дані до єдиного формату, наприклад, нормалізувати пікселі зображень. Наступним кроком є створення пар зображень, які будуть подаватися до мережі. Для цього потрібно зібрати позитивні пари і негативні пари. Це забезпечує модель даними для навчання, щоб вона могла навчитися порівнювати схожість і відмінність між зображеннями. Після цього дані повинні бути розділені на навчальний та тестовий набори, щоб оцінити ефективність моделі на невідомих їй даних. ==End of OCR==

Use Quizgecko on...
Browser
Browser