понеділок, 31 липня 2023 р.

Зменшення розміру зображення в два рази за допомогою Keras

В даному пості ми розглянемо, як використовувати бібліотеку глибокого навчання Keras для зменшення розміру зображення в два рази. Це можна зробити за допомогою так званого "пулінгового" шару.

Що таке пулінговий шар?

Пулінговий шар - це шар, який часто використовується в згорткових нейронних мережах для зменшення просторового розміру (ширина і висота) вхідного об'єкта. Він працює, виконуючи певну операцію (наприклад, максимум або середнє значення) на пікселях в певному вікні на вхідному об'єкті і виводячи результат.

Створення пулінгового шару в Keras

Ми можемо створити пулінговий шар за максимумом в Keras за допомогою класу MaxPooling2D:
from keras.models import Sequential
from keras.layers import MaxPooling2D

# створення моделі з одним шаром MaxPooling2D, який зменшує розмір зображення в два рази
model = Sequential()
model.add(MaxPooling2D(pool_size=(2, 2), input_shape=(None, None, 3)))
Ця модель прийматиме зображення будь-якого розміру з 3 каналами кольору (RGB) і зменшить його в два рази. Використання моделі для зменшення зображення

Тепер, коли у нас є модель, ми можемо використовувати її для зменшення розміру зображення:

import cv2
import numpy as np
Lena = cv2.imread('Lena.jpg')
image=Lena/255.0
image = np.expand_dims(image, axis=0)
output = model.predict(image)
output_image = output[0, :, :, :3]
У цьому коді ми завантажуємо та нормалізуємо зображення 'Lena.jpg', а потім передаємо його в модель Keras для зменшення розміру в два рази. На виході ми отримуємо зображення, розмір якого зменшений в два рази за допомогою моделі, та витягуємо RGB канали цього зображення.

Рядок

np.expand_dims(image, axis=0)
додає нову вісь до масиву image на позиції 0. Наприклад, якщо вихідне зображення має форму (висота, ширина, канали), після додавання нової осві форма зображення змінюється до (1, висота, ширина, канали). Це робиться для того, щоб підготувати зображення до передачі в нейронну мережу, оскільки багато функцій Keras очікують вхідні дані у формі батчу (масиву зразків), навіть якщо цей батч містить лише один зразок. Також в моделях можна використати інші типи пулінгових шарів попередньо імпортувавши їх
 from keras.layers import AveragePooling2D
# Створення моделі
model = Sequential()
# Додавання шару AveragePooling2D
model.add(AveragePooling2D(pool_size=(2, 2), input_shape=(None, None, 3)))
У цьому прикладі, pool_size=(2, 2) означає, що пулінговий шар буде брати середнє значення кожного вікна розміром 2x2 пікселів в початковому зображенні.

Вхідне зображення повинно мати 3 канали кольору (RGB).

Це все можна було зробити і без створення моделі, просто застосувавши пулінговий шар як оператор до зображення

avg_pool_layer = AveragePooling2D(pool_size=(2, 2))
output = avg_pool_layer(image)
output_image = output[0, :, :, :].numpy()

Звичайно ніхто так зменшувати зображення не буде, мета цього посту продемострувати функціональні можливості Keras навіть для невластивих для нього задач.

неділю, 29 січня 2023 р.

Клас Counter

Клас Counter з модуля collections у Python є підкласом dict для підрахунку хешованих об’єктів. Це контейнер, який буде зберігати підрахунок кожного з елементів, присутніх у контейнері. Елементи в контейнері зберігаються як ключі словника, а їх кількість зберігається як значення словника. Клас Counter схожий на словник, але він має деякі додаткові функції, такі як можливість підраховувати елементи в ітерації та повертати найпоширеніші елементи в контейнері. Одним із основних випадків використання класу Counter є підрахунок елементів у списку, наприклад:
from collections import Counter

# create a list of elements
elements = ['apple', 'banana', 'apple', 'orange', 'banana', 'orange']

# create a counter object
counter = Counter(elements)

# Print the count of each element
print(counter)

Counter({'apple': 2, 'banana': 2, 'orange': 2})
Об’єкт counter підраховує кількість входжень кожного елемента та повертає об’єкт, подібний до словника, де ключі є елементами, а значення – підрахунками. Іншою корисною функцією Counter є метод most_common(), який повертає список із n найпоширеніших елементів і їх підрахунок від найпоширенішого до найменшого, наприклад:
# get the top two most common elements
print(counter.most_common(2))
[('apple', 2), ('banana', 2)]
Клас Counter також підтримує математичні операції, такі як додавання та віднімання лічильників, наприклад:
# create two counter objects
counter1 = Counter(['apple', 'banana', 'apple'])
counter2 = Counter(['orange', 'banana', 'orange'])

# add two counters
counter3 = counter1 + counter2

# subtract two counters
counter4 = counter1 - counter2

пʼятницю, 12 серпня 2022 р.

Рядки

Під рядком розуміється послідовність ( одновимірний масив) символів. Рядки в Python оточені або одинарними, або подвійними лапками, s='hello' є тим самим що і s="hello". Символьний тип в Python відсутній, символ трактується як рядок довжини 1. Рядок є масивом, доступ до конкретного символу відбувається за номером його позиції.

s='hello'
print(s[0])
h  
Рядки є незмінюваним(inmutable) типом даних, елемент рядка не можна змінити переприсвоєнням. Спроба запустити такий код видає помилку

s='hello'
s[0]='a'
Рядки великої довжини беруться в потрійні лапки. Перебирати елементи рядка можна в циклі

for x in "апельсин":
  print(x) 
Перевірка чи підрядок t міститься ( не міститься) в рядку s виконується логічним оператором t in s (not in). Методи для роботи з рядками
 
s.upper()# всі літери великі
s.capitalize()# тільки перший символ великий
s.lower()# всі літери малі
s.casefold()# те саме тільки для більшої кількості символів( для UniCode) 
s.strip()# вилучає пробіли на початку і кінці рядка
s.strip(str(['b','c']))# вилучає вказані літери з початку і кінця,  до місця            зустрічі із літерою яка не в списку
s.lstrip(*), s.rstrip(*)# те саме тільки зліва чи справа
s.replace("H", "J")# Замінює в тексті першу літеру на другу
s.replace("Hre", "Jwew")#або один рядок на інший
s.translate(str.maketrans({"H": "J",'e':'o'}))#множинна заміна, попередньо maketrans  формує таблицю заміни із словника
s.translate(str.maketrans("He", "Jo"))# це саме без словника
s.maketrans(x, y[, z])# перші два аргументи для визначення заміни, третій рядок буде виключений із результату
s.split(","[,n])#видає список із слів які знаходяться між комами. Замість коми може  бути будь-який сепаратор. n задає кількість розбитів, за умовчанням  --максимальна
sq+s2# конкатенація 
txt*3# повторення рядка  три рази,без пробілів
s.center(20[,char])# вирівнює тес посередині добавляючи 20 пробілів (або інших символів), по 10 спереду і ззаду
s.count('value'[, start, end])# підраховує скільки раз значення зустрілося в рядку ( за умовчанням), або у його частині
s.endswith('value'[, start, end])# Повертає True якщо рядок закінчується вказаним виразом
s.find('value'[, start, end])# знаходить номер першого входження символу, або -1 якщо немає входження
s.isalnum()# Повертає True якщо всі символи рядка літери a-z або числа
s.isalpha()# Повертає True якщо всі символи рядка літери
s.isdecimal()# Повертає True якщо всі символи рядка є числа, в в тому числі записані  в  юнікодах. Схожі методи isnumeric(),  isdecimal(),  з деякими відмінностями.
s.isspace()# Повертає True якщо всі символи рядка є пробіли
s.isupper()# Повертає True якщо всі літери в  рядку  є великі 
"sep".join(s)# якщо s рядок то повертає рядок де між символами вставлений сепаратор, якщо s список   чи  кортеж символів, то об'єднує елементи в один рядок з вказаним сепаратором 
s.ljust(n[, character])# вирівнює рядок вставкою зліва n символів, пробілів за умовчанням
s.rjust(n[, character])# те саме тільки справа
s.partition(value)# розбиває рядок на кортеж з трьох підрядків -  до value, value і  після  value.Якщо value на початку чи в кінці  то будуть порожні підрядки
s.rfind(value[, start, end])# повертає  номер позиції останнього входження підрядка, або -1 якщо не знайдено підрядок
s.rindex(value[, start, end])# Те саме тільки замість -1 видає помилку
s.startswith(value[, start, end])# повертає True якщо рядок починається із слова value
s.swapcase()# змінює великі літери на малі і навпаки
chr(i)# повертає символ зайого номером в юнікоді
ord(char)# повертає юнікод символа 

Множина

Невпорядкований, незмінюваний набір даних, не допускає повторення. Допускає додавання та видалення елементів. Доступ до елементів може бути за індексом, але елементу множини не відповідає фіксований індекс.

S.add(x)# включає елемент у  множину
S.update(L)# об'єднує  S з елементами об'єкту L, не обов'язково  інша множина
S1.union(S2,S3,...)# звичайне об'єднання множин
S1.intersection(S2)# повертає нову множину, яка є перетином множин
S1.intersection_update(S2)# замінює S1 на перетин 
S1.difference(S2),S1.difference_update(S2)# різниця множин з нюансами
S1.symmetric_difference(S2)# повертає нову множину яка є симетричною різницею
S1.symmetric_difference_update(S2)# замінює S1 на  симетричну різницю
S1.isdisjoint(S2)# перевіряє чи множини мають спільні елементи
S1.issubset(S2)# перевіряє чи S1 є підмножиною S2.
S1.issuperset(S2)# перевіряє чи S2 є підмножиною S1.
S.remove( x)# видаляє  елемент x, якщо його немає  то видає помилку
S.discard( x)# видаляє  елемент x, якщо його немає  то ігнорує
S.pop()# повертає  випадковий елемент з множини,видаляючи його з неї
S.clear()# спорожнює множину
S.del()# повністю знищує множину
S.copy() # створює копію множини   

неділю, 31 липня 2022 р.

Підрахунок кількості повторень елементів в списку

Будується словник
from collections import Counter
grid=[1,1,2,3,1]
C=Counter(grid)
Counter({1: 3, 2: 1, 3: 1})
C[1]
3
Задача Скільки спільних елементів є в двох списках?
from collections import Counter
  #Дано два списки L1,L2
C1=Counter(L1)
C1=Counter(L1)
len(C1&C2)
#sum([C1[x]*C2[x] for x in C1  ])
Клас Counter() модуля collections - це підклас словника dict для підрахунку хеш-об'єктів - незмінних (inmutable), таких як рядки, числа, кортежі.