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!