article banner

Штучний інтелект на Python

Це фрагмент книги Python з нуля, яка допоможе вам навчитися програмуванню з нуля. Ви можете знайти його на Allegro, Empik та в інтернет-книгарнях.

Іншим важливим застосуванням даних є машинне навчання. Це область штучного інтелекту, присвячена алгоритмам, які розвиваються завдяки наданим даним. Нам буде легше зрозуміти, що це, коли ми побачимо кілька прикладів.

Приклади використання штучного інтелекту

Штучний інтелект часто асоціюється з іграми, тобто грою проти так званого "комп’ютера". Для створення таких алгоритмів справді часто використовується машинне навчання. Часто на початку записується певна кількість ігор між людьми. Алгоритм навчається поводитися якомога подібніше. Потім можна симулювати ігри між різними алгоритмами та навчати їх на основі перемог чи поразок. Навчені таким чином алгоритми можуть стати набагато успішнішими за людей. Вже в 1997 році штучний інтелект переміг шахового гросмейстера Гаррі Каспарова. У 2016 році комп’ютер переміг чемпіона світу з Ґо. Навіть у DOTA 2 алгоритми перевершили чемпіонів світу.

Дуже корисним застосуванням машинного навчання є розпізнавання зображень. Якщо відкрити програму Google Assistant на телефоні з ОС Android, увімкнути режим камери і направити об’єктив на друкований текст, програма розпізнає написаний текст. Раніше я часто використовував цю функцію за кордоном для перекладу меню в закладах харчування. Алгоритми вчаться розпізнавати текст завдяки численим прикладам. Розпізнавання зображень використовується в багатьох інших сферах. Наприклад, існують алгоритми, навчені розпізнавати пухлини на основі зображень знімків УЗД або КТ. Деякі здатні розпізнати такі зміни на більш ранніх стадіях та зі статистично більшою точністю, ніж лікарі. Зрештою, вони вчилися на більшій кількості прикладів, аналізують кожен піксель і ніколи не втомлюються. Тому у все більшій кількості лікарень по всьому світу їх використовують для допомоги лікарям.

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

Приклад проєкту

У нашому проєкті ми навчимо алгоритм розпізнавати написані від руки цифри. Таке розпізнавання може бути корисним у поштовому відділенні, щоб зчитувати поштові індекси, вписані у клітинки. Ми використаємо дуже популярний алгоритм, який називається нейронна мережа. На неї можна дивитися як на чорну скриньку, в яку ми кладемо приклади разом з інформацією про очікувану відповідь, а потім даємо команду вивчити ці приклади. Після цього мережа повинна добре відповідати на запитання про надані приклади, але, якщо вона добре узагальнить отримані дані, вона також повинна добре класифікувати 1 приклади, яких вона раніше не бачила.

Ми будемо виконувати реалізацію цього алгоритму з пакету sklearn (його потрібно встановити). Що стосується фотографій текстів, ми використаємо набір, який входить у цей же пакет.

from sklearn import datasets

digits = datasets.load_digits()

Цей набір чисел містить 1797 записів. Це небагато, тому що сучасні алгоритми навчаються на значно більших наборах. Крім того, ці знімки мають не дуже високу роздільну здатність. Тож це буде певним викликом.

Перші цифри з нашого набору.

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

n_samples = len(digits.images)  # 1797
data = digits.images.reshape((n_samples, -1))

Після того, як ми навчимо нашу мережу, ми захочемо перевірити, як вона справляється з розпізнаванням чисел, яких вона раніше не бачила. Тому нам потрібно відкласти частину цифр для тестування. Дані, які використовуються для навчання, називаються тренувальними і матимуть закінчення _train. Ті ж, що використовуються для перевірки, називаються випробувальними і матимуть кінцівку _test. Змінна X представляє приклади, тобто в нашому випадку зображення, а y — відповіді. Щоб розділити наші дані на тренувальний та випробувальний набори, ми можемо використати функцію train_test_split. Відкладемо у випробувальний набір даних 30 % (тобто 0.3) прикладів.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.3
)

Нарешті настав час створити нашу нейронну мережу та навчити її тренувальним прикладам. Ми будемо використовувати класичну нейронну мережу під назвою багатошаровий перцептрон (англ. Multi-Layer Perceptron, MLP). Для навчання використовується функція fit. Навчання може бути досить тривалим. Для великих мереж і наборів даних воно може зайняти навіть багато годин (з чим я зіштовхнувся під час написання дипломної роботи). Однак у нас невелика мережа і невеликий набір даних, тож все має пройти дуже швидко.

from sklearn.neural_network import MLPClassifier

clf = MLPClassifier(hidden_layer_sizes=(100, 100))
clf.fit(X_train, y_train)

clf — це скорочення від "класифікатор", тобто алгоритм, який розподіляє елементи за категоріями (у нашому випадку категорії — це різні цифри).

Почнімо з перевірки, чи справді наша мережа засвоїла тренувальний набір. Попросімо її розпізнати приклади з тренувального набору. Порівнявши результати з тренувальним набором, отримуємо 100 % точності.

# y_train_pred i y_train to tablice z numpy
# порівняння також повертає таблицю
y_train_pred = clf.predict(X_train)
print((y_train_pred == y_train).mean())  # 1.0

Однак справжньою перевіркою буде кількість правильних відповідей щодо набору, якого машина не знала. Побачимо, як вона упорається з випробувальним набором даних.

y_test_pred = clf.predict(X_test)
print((y_test_pred == y_test).mean())  # 0.988

Вона помилилася лише в 1.2% випадків. Це справді хороший результат, враховуючи якість знімків і невелику кількість тренувальних даних. У мене є великі сумніви, що людина впоралася б краще. Нижче я додаю кілька випадкових символів разом із відповідями, наданими нашим алгоритмом.

Завершення

Машинне навчання — це, звичайно, масштабна тема. Однак варто ознайомитися з її можливостями та методами, адже воно стає все важливішим та може мати величезний вплив на наше майбутнє.

1:

Класифікувати — приписати до категорії, тобто в нашому випадку — розпізнати цифру.

2:

Двовимірне зображення можна уявити собі як величезну таблицю, де кожне значення визначає інтенсивність кольору в певному місці. Це дуже поширений формат опису зображень.