Warning: fopen(/home/isearch/.system/tmp/index-rTHMaA.tmp): failed to open stream: Disk quota exceeded in /home/isearch/isearch.net.ua/www/wp-admin/includes/class-wp-filesystem-ftpext.php on line 190

Warning: unlink(/home/isearch/.system/tmp/index-rTHMaA.tmp): No such file or directory in /home/isearch/isearch.net.ua/www/wp-admin/includes/class-wp-filesystem-ftpext.php on line 193
10 хвилинне практичне заняття з TensorFlow для початківців – iSearch

10 хвилинне практичне заняття з TensorFlow для початківців

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

Заняття розділене на дві частини: у першій частині ми пояснюємо основи на робочому прикладі, у другій частині ‒ будуємо модель лінійної регресії.

Частина 1. Основи TensorFlow

Основні функції та можливості TensorFlow:

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

Які ж завдання можна вирішувати за допомогою TensorFlow?

  1. Розпізнавання образів і визначення об’єктів за фото.
  2. Обробка природної мови (NLP): для аналізу і розуміння природної мови (визначення тональності тексту, машинний переклад і створення текстових моделей).
  3. Прогнозування часових рядів: прогноз майбутніх значень часових рядів (корисно у фінансовій аналітиці, метеорології та інших галузях).
  4. Навчання з підкріпленням: алгоритми навчаються ухвалювати рішення, які допомагають їм отримати максимальну винагороду в певній обстановці або середовищі.

TensorFlow – це бібліотека для чисельних розрахунків, у якій дані проходять через граф. Дані TensorFlow представлені n-мірними масивами ‒ тензорами. Граф складається з даних (тензорів) та математичних операцій.

У вузлах графа знаходяться математичні операції. Ребра графа представляють тензори, які “перетікають” між операціями.

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

Почнемо вчитися на практиці. Запустимо Python та імпортуємо TensorFlow:

~$ python
Python 3.12.2 (tags/v3.12.2:6abddd9, Feb  6 2024, 21:26:36) [MSC v.1937 64 bit (AMD64)] on linux2

Type “help”, “copyright”, “credits” or “license()” for more information.
>>>
>>>import tensorflow as tf

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

1.1. Графи в TensorFlow

Граф ‒ це основа TensorFlow, всі обчислення (операції), змінні знаходяться на графі. Все, що відбувається в коді знаходиться на дефолтному графі, наданому TensorFlow. Ми можемо отримати доступ до цього графа так:

graph = tf.get_default_graph()

А так можемо отримати список усіх операцій у цьому графі:

graph.get_operations()

Зараз ваш граф порожній. Якщо нам необхідно надрукувати назву кожної операції, виконаємо наступний код:

for op in graph.get_operations():
    print(op.name)

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

1.2. Сесії у TensorFlow

Граф лише визначає обчислення (створює проєкт), але не має жодних змінних, жодних значень, якщо ми не запустимо граф чи частину графа у сесії. Можемо створити сесію так:

sess=tf.Session()
… your code …
… your code …
sess.close()

Не забуваємо, що, розпочавши сесію, нам необхідно її завершити або використати блок with… as, наприклад ось так:

with tf.Session() as sess:
    sess.run(f)

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

1.3. Тензори в TensorFlow

TensorFlow зберігає дані в тензорах ‒ багатовимірних масивах дуже схожих на масиви numPy.

a) Константи – це значення, які не можуть бути змінені. Вони визначаються так:

a=tf.constant(1.0)

при цьому при спробі виводу отримаємо таке:

print(a)
<tf.Tensor’Const:0′ shape=() dtype=float32>
print(a)
Tensor(“Const:0”, shape=(), dtype=float32)

Як можемо бачити, це відрізняється від інших мов програмування, наприклад, від Python. Ми не можемо роздрукувати або отримати доступ до константи, поки не запустимо сесію. Давайте так і зробимо:


with tf.Session() as sess:
    print(sess.run(a))

Код виведе 1.0

b) Змінні ‒ це також тензори, які схожі на змінні в інших мовах програмування:

>>>b = tf.Variable(2.0,name=”test_var”)
>>>b
<tensorflow.python.ops.variables.Variable object at 0x7f37ebda1990>

На відміну від констант, змінні можуть змінювати свій вміст. Однак змінні TensorFlow повинні бути ініціалізовані в окремій операції ініціалізації. Можливо, досить трудомістко ініціалізувати всі змінні, але TensorFlow надає механізм ініціалізації всіх змінних за раз:

init_op = tf.global_variables_initializer()

Тепер необхідно запустити операцію ініціалізації перед тим, як спробуємо отримати доступ до змінної:

with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(b))

Код виведе 2.0.

Якщо тепер спробуємо роздрукувати операції у графі:

graph = tf.get_default_graph()
for op in graph.get_operations():
    print(op.name)

то отримаємо наступний вивід:

Const

test_var/initial_value

test_var

test_var/Assign

test_var/read

init

Як бачимо, ми оголосили «a» як Const, і вона була додана до графа. Аналогічно, для змінної b до графа TensorFlow було додано багато станів test_var, таких як test_var/initial_value, test_var/read тощо. Ми можемо візуалізувати всю мережу, використовуючи TensorBoard, який є інструментом для візуалізації графів TensorFlow і процесу навчання.

с) Плейсхолдери ‒ це тензори, що очікують ініціалізації даними. Вони використовуються для даних, які будуть надані тільки коли код фактично буде виконаний у сеансі. Те, що передається в плейсхолдер ‒ це словник, який містить назви плейсхолдерів та їх значення:


a = tf.placeholder(“float”)
b = tf.placeholder(“float”)
y = tf.multiply(a, b)
fd = {a: 2, b: 3}
with tf.Session() as sess:
    print(sess.run(y, fd))

Даний код виведе 6.0.

1.4. Пристрої в TensorFlow

TensorFlow має дуже потужні вбудовані можливості для запуску коду на GPU, CPU або кластерах. Він надає можливість вибрати пристрій, на якому ми хочемо запускати код. Однак, це не те, про що варто задумуватися, коли ми тільки починаємо знайомство з TF.

Нижче повна картина того, як влаштовані обчислення в TensorFlow:

Частина 2. Простий приклад з використанням TensorFlow

У цій частині розглянемо код запуску лінійної регресії. Перед цим розглянемо деякі основні функції TensorFlow, які будемо використовувати в коді.

Створення випадкового нормального розподілу:

Використаємо random_normal для створення випадкових значень із нормальним розподілом. У цьому прикладі w ‒ це змінна розмірності 784*10 з випадковими значеннями із стандартним відхиленням 0,01.

w=tf.Variable(tf.random_normal([784, 10], stddev=0.01))

Reduce_mean ‒ обчислює середнє значення масиву

b = tf.Variable([10,20,30,40,50,60],name=’t’)
with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    sess.run(tf.reduce_mean(b))

Даний код виведе 35.

argmax ‒ дуже схожий на argmax у Python. Отримує максимальне значення з тензора вздовж зазначеної осі.

a=[ [0.1, 0.2,  0.3  ],
    [20,  2,       3   ]
    ]
b = tf.Variable(a,name=’b’)
with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    sess.run(tf.argmax(b,1))

Виведе масив ([2, 0]), який показує індекс максимального значення у кожному з рядків a.

Завдання лінійної регресії

Постановка задачі: є велика кількість точок даних, побудуйте їм у відповідність пряму лінію. Для цього прикладу створимо 100 точок даних і спробуємо поставити їм у відповідність лінію.

2.1. Створення тренувального набору даних

trainX містить значення між -1 і 1, а trainY ‒ збільшене в 3 рази значення trainX плюс деяку випадкову величину:


import tensorflow as tf
import numpy as np

trainX = np.linspace(-1, 1, 101)
trainY = 3 * trainX + np.random.randn(*trainX.shape) * 0.33

2.2. Плейсхолдери

X = tf.placeholder(“float”)
Y = tf.placeholder(“float”)

2.3. Моделювання

Модель лінійної регресії має вигляд:

Ymodel = w*x

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

(YYmodel)2

TensorFlow поставляється з багатьма оптимізаторами, які розраховують та оновлюють градієнти після кожної ітерації, намагаючись мінімізувати зазначену функцію вартості. Ми збираємося визначити операцію навчання, використовуючи GradientDescentOptimizer, щоб мінімізувати нашу функцію вартості при швидкості навчання 0,01. Потім запустимо цю операцію навчання у циклі.

w = tf.Variable(0.0, name=”weights”)
y_model = tf.multiply(X, w)

cost = (tf.pow(Y-y_model, 2))
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

2.4. Навчання

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

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    for i in range(100):
        for (x, y) in zip(trainX, trainY):
            sess.run(train_op, feed_dict={X: x, Y: y})
    print(sess.run(w))

Звернемо увагу, що перше, що було зроблено, це ініціалізація змінних шляхом виклику init всередині session.run(). Потім ми запускаємо train_op, згодовуючи їй feed_dict. Нарешті, друкуємо значення w (знову всередині sess.run()), яке має бути рівне близько 3.

Вправа:

Якщо створимо нову сесію після цього коду та спробуємо надрукувати w, що виведеться?


with tf.Session() as sess:
    sess.run(init)
    print(sess.run(w))

Так, виведеться 0.0. Як тільки ми вийшли із сесії, створеної раніше, всі операції перестають існувати. Повний код можна завантажити тут.

Звичайно, TensorFlow не єдиний фрейворк для машинного навчання. Спробуємо порівняти його з іншими бібліотеками машинного навчання:

Критерій

TensorFlow

PyTorch

scikit-learn

Гнучкість

Висока. Може бути використана для різноманітних завдань машинного навчання, включно з глибоким навчанням.

Гнучкість схожа з TensorFlow, але часто вважається більш простою та інтуїтивною.

Націлена на простоту використання і надає набір інструментів для класичних методів машинного навчання.

Швидкість розробки

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

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

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

Використання в індустрії

Широко використовується в індустрії й активно підтримується у великих компаніях.

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

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

За матеріалами habr.com