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!