- •Ссылки на лекции
- •Удобные функции: Функция с сохранением
- •Функция, создающие аргументы для двумерного графика
- •Загрузка файлов в Colab (на примере архива с изображениями деревьев)
- •Лабораторная работа № 1. Работа с изображениями
- •Лабораторная работа № 2. Подготовка изображений для машинного обучения
- •Лабораторная работа № 3. Классификация изображений на основе логистической регрессии
- •Лабораторная работа № 4. Проверка гипотезы
- •Лабораторная работа № 5. Метод главных координат.
- •Лабораторная работа № 6. Кривые обучения.
- •Лабораторная работа № 7. Машинное обучение без учителя.
- •Лабораторная работа № 8. Обнаружение аномалий.
Лабораторная работа № 2. Подготовка изображений для машинного обучения
Дано: Набор изображений со спутника с деревьевьями и без
https://drive.google.com/file/d/1yPAs-3H5gQGdM02KFiZKwVHT4AM_yeiI/view?usp=sharing
(Набор данных взят из базы данных https://www.kaggle.com/datasets/mcagriaksoy/trees-in-satellite-imagery)
Подготовить изображения для машинного обучения для классификации наличия деревьев на изображениях.
1. Составить список файлов в каждой папке
Для этого можно использовать функцию os.listdir('Путь\\к\\папке')
2.а Создать список из массивов numpy с изображениями для каждой папки.
2.б Отобразить на экране изображение № j из папки NoTrees, если j < 50 или из папки Trees, если j >49.
3. Создать массив параметров X для машинного обучения. Каждая компонента R,G,B каждого пикселя -- это отдельный параметр - столбец, каждое изображение -- строка.
3.а Превратить изображения в одномерные массивы параметров с помощью метода .flatten(). В этом случае изображение превращается в массив размера (1 x n), где n – количество элементов исходного массива с изображением, следующего вида:
R(0,0) |
G(0,0) |
B(0,0) |
R(0,1) |
G(0,1) |
… |
G(h-1,w-1) |
B(h-1,w-1) |
3.б Объединить одномерные массивы в многомерный, где каждая строка X[i,:]-- это одномерный массив, полученный из i-го изображения.
4. Создать массив результатов y, так, что элемент y[i,0] = 0, если строка X[i,:] соответствует изображению без деревьев, а y[i,0] = 1, если строка X[i,:] соответствует изображению с деревьями.
5. Перемешать строки массивов X и y, сохранив соотношение из предыдущего пункта.
Если j чётно: объединить массивы X и y по горизонтали (например с помощью функции np.hstack((a, b)), где a и b – объединяемые матрицы, воспользоваться функцией перемешивание np.random.shuffle(), после разделить массивы.
Если j нечётно: создать порядок перемешивания с помощью функции perm = np.random.permutation(n) и применить его к обоим массивам по типу:
arr = arr[perm]
6. Разделить наборы данных на 3 части: для обучения, для кроссвалидации, для тестирования:
Если j заканчивается на 0-5: 60%, 20%, 20% соответственно
Если j заканчивается на 6-9: по 2000 на кроссвалидацию и тестирование, остальные на обучение.
7. Для каждой из трёх частей (обучение, кроссвалидация, тестирования) вывести первое изображение и напечатать на экране, есть ли на нём деревья.
Чтобы из одномерного массива восстановить изображение, воспользоваться функцией reshape:
img = np.reshape(X[i,:], (width, height,3))
Лабораторная работа № 3. Классификация изображений на основе логистической регрессии
Дано: Набор изображений со спутника с деревьевьями и без (см. прошлую работу)
Задание:
1. Подготовить данные (пункты 1.а и 1.б):
1.а. Упростить данные по вариантам (j % 5 + 1):
Использовать каждый 8-й параметр каждого изображения
Использовать только зелёный канал и только чётные строки изображения
Использовать ч/б изображение, усреднив красный, синий и зелёный каналы, и использовать только нечётные строки изображения
Использовать центральную область изображения (⅓ от высоты и ⅓ от ширины)
Уменьшить разрешение изображений в 4 раза, усреднив области 4х4 пикселя
Для этого воспользуйтесь функцией
skimage.transform.resize(image, (new_h, new_w))
1.б. Подготовить данные для обучения для логистической регрессии (составить наборы параметров для обучения, кроссвалидации, тестирования) (см. предыдущую работу)
2. Составить функцию, рассчитывающую логистическую гипотезу на основе параметров и коэффициентов регрессии.
Примечание: Перед преобразованием с помощью функции сигмоида, ограничить значения величинами [-30, 30], чтобы не было переполнения результата:
z[z < -30] = -30
z[z > 30] = 30
3. Составить функцию, рассчитывающую стоимость ошибки гипотезы.
4. Составить функцию, рассчитывающую производные функции стоимости ошибки.
5. Составить функцию, рассчитывающую коэффициенты регрессии по методу градиентного спуска
6. Преобразовать данные в тип float и пронормировать к интервалу 0-1:
X = X.astype('float64') /255
7. Используя функции по пункту 3-5, выполнить машинное обучение и найти коэффициенты гипотезы. Использовать только ту часть исходных данных, которая для обучения.
8. Используя гипотезу, найти процент ошибок на данных для тестирования.
