Python. TensorFlow для чайников. Часть 1.

TensorFlow  — это мощная библиотека для создания нейронных сетей. На уроке Пишем нейросеть на Python. Часть 1 я уже писал, как сделать нейросеть на Python. Поскольку вторая часть пока в работе, решил написать статью про TensorFlow, ибо это поистине великолепный инструмент. Если раньше нам надо было создавать свои классы, чтобы хранить информацию о весах нейрона, объединять их в слои и еще добавлять туда алгоритмы обучения, то теперь все это есть в TensorFlow.

Как его установить? Сначала скачиваем whl файл, затем устанавливаем его, примерно вот так:

C:\Users\user\AppData\Local\Programs\Python\Python36\python.exe -m pip install tensorflow-1.2.0rc2-cp36-cp36m-win_amd64.whl

Итак, сначала попробуем создать простой нейрон с одним входом и выходом, который реализует линеную функцию:

import tensorflow as tf

#Создадим граф
graph = tf.get_default_graph()

#Создадим входное значение
input_value = tf.constant(1.0)

#Создадим переменную
weight = tf.Variable(0.8)

#Создаим выходное значение
output_value = weight * input_value

Мы создали простой нейрон со входом, выходом, и одним входным весовых коэффициентом. Чтобы попользоваться им, нам нужно создать сессию:

#создаим сессию
sess = tf.Session()

Затем инициализировать переменные:

init=tf.global_variables_initializer()
sess.run(init)

После этого мы можем вывести значение на экран:

print(sess.run(output_value))

У нас выведет 0.8 — результат умножения входного значения 1 на весовой коэффициент 0.8.

Теперь попробуем его обучить. Допустим, мы желаем получить на выходе не 0.8, а к примеру 2. В этом случае нам надо задать желаемое значение, функцию ошибки и оптимизатор:

#Создаем оптимизиатор
desired_output_value = tf.constant(2.0)
loss = (output_value - desired_output_value)**2 #Функция ошибки
optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор
grads_and_vars = optim.compute_gradients(loss)

А потом еще надо итерационно, много раз применить оптимизацию (в цикле), вот так:

#Обучаем
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)
for i in range(100):
    sess.run(train_step)

А вот весь код нашего примера:

import tensorflow as tf

#Создадим граф
graph = tf.get_default_graph()

#Создадим входное значение
input_value = tf.constant(1.0)

#Создадим переменную
weight = tf.Variable(0.8)

#Создаим выходное значение
output_value = weight * input_value

#создаим сессию
sess = tf.Session()

#Создаем оптимизиатор
desired_output_value = tf.constant(2.0)
loss = (output_value - desired_output_value)**2 #Функция ошибки
optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор
grads_and_vars = optim.compute_gradients(loss)

#Инициализируем переменные
init=tf.global_variables_initializer()
sess.run(init)


#Обучаем
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)
for i in range(100):
    sess.run(train_step)

print(sess.run(output_value))

В результате мы получим число, близкое к 2 (к нашему желаемому выходу), например 1.9929.

Часто для оцени процесса обучения смотрят график обучения, на котором, как правило, отображается ошибка обучения (как она уменьшается со временем). Давайте и мы так же сделаем, воспользовавшись питоновской библиотекой научной графики.

Для этого нам надо импортунть саму библиотеку, в цикл обучения вставать код, который будет выводить значение ошибки на каждой итерации в список или массив, и отобразить этот список или массив на графике. Вот полный код программы с данными изменениями:

import tensorflow as tf
import matplotlib.pyplot as plt

#Создадим граф
graph = tf.get_default_graph()

#Создадим входное значение
input_value = tf.constant(1.0)

#Создадим переменную
weight = tf.Variable(0.8)

#Создаим выходное значение
output_value = weight * input_value

#создаим сессию
sess = tf.Session()

#Создаем оптимизиатор
desired_output_value = tf.constant(2.0)
loss = (output_value - desired_output_value)**2 #Функция ошибки
optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор
grads_and_vars = optim.compute_gradients(loss)

#Инициализируем переменные
init=tf.global_variables_initializer()
sess.run(init)

#задаем начальные массивы
x=[]
y=[]


#Обучаем
train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss)
for i in range(100):
    sess.run(train_step)
    x.append(i)
    y.append(sess.run(loss))

print(sess.run(output_value))

#Строим график
fig = plt.figure()
plt.plot(x, y)
 
#Отображаем заголовки и подписи осей
plt.title('График функции')
plt.ylabel('Ось Y')
plt.xlabel('Ось X')
plt.grid(True)
plt.show()

А вот сам график обучения:

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar