Примечания TensorFlow (2) — Использование TensorFlow для обучения простейшей одномерной линейной модели

TensorFlow

предисловие

Это одно использование«Примечания к TensorFlow (1) — связанные основные понятия в TensorFlow»Цель экспериментов с машинным обучением — понять, что такое машинное обучение, а с другой стороны, его также можно использовать для изучения и использования некоторых знаний, полученных ранее. Среда для этой реализации:

  • macOS Mojave 10.14.1
  • питон 3.7.0 (pyenv)
  • Tensorflow 1.12.0
  • numpy 1.15.4

Краткое введение в то, что такое машинное обучение

Процесс машинного обучения и человеческого обучения:

image

Если вы чувствуете, что приведенную выше картинку нелегко понять, вот еще один каштан:

Предположим, у вас есть девушка, которая очень красива. Для того, чтобы узнать друг друга, у вас свидание за ужином каждые выходные, прошло уже 8 недель, и каждую неделю ваша девушка будет на 10-30 минут позже оговоренного времени, поэтому каждый раз, когда у вас свидание, вы тоже будет на 10- позже оговоренного времени 30 минут, а вы подвели правило (если она звонила до встречи и говорила, что ушла из дома, то она обычно опаздывала минут на 30, а если говорила, что скоро приедет, она бы опоздала на 10 минут), но вы подруга опоздали с 10, 30 минут до 15, 45 минут, вы также скорректировали время, чтобы прибыть позже оговоренного времени.

По приведенным выше каштанам? проведем аналогию:

Метод машинного обучения — это метод, при котором компьютер использует имеющиеся данные (опыт 8 встреч) для вывода определенной модели (закон опоздания), и использует эту модель для предсказания будущего (опоздает ли оно).

Основы Tensorflow

О базовых знаниях я здесь много говорить не буду, подробнее см.«Примечания к TensorFlow (1) — связанные основные понятия в TensorFlow»

построить линейную модель

Давайте сначала объясним, что представляет собой эта простая линейная модель, которую нам нужно построить:

Предположим, у нас есть линейная модель (линейная функция от одной переменной):y=0.1x+0.2, мы знаем, как выглядит эта линейная модель, это прямая линия, но теперь я хочу, чтобы машина знала эту прямую, что мне делать? Помните каштан, упомянутый выше, мы можем предоставить серию подобных(x,y)данные, а затем ввестиy=k*x_data+b, после нахождения значений k и b машина также знает, как выглядит линейная модель.

Вот более математическое введение:

Для множества точек размера n ?={(?1,?1),(?2,?2),…(??,??)} ,

Цель линейной модели состоит в том, чтобы найти множествоKПрямая, образованная ? ?=K?+? ,

сделать потерю стоимости всех очковloss=\sum_{i}^{n}(K?_?+?−?_?)^2Чем меньше, тем лучше, потому что чем меньше ????, тем меньше разрыв между прогнозируемым значением и истинным значением.

Потому что если мы найдем такую ​​группуKи ? , мы можем предсказать определенное?_?из?_?ценность.

Здесь я хотел бы сказать еще несколько слов, линейные модели могут не всегда хорошо предсказывать в практических приложениях.?_?Это связано с тем, что фактическое распределение данных может быть нелинейным, оно может быть квадратичным, кубическим, круговым или даже нерегулярным, поэтому важно решить, когда можно использовать линейную модель. Это делается только потому, что мы знаем, что здесь линейная модель, и соответствующий метод необходим при фактическом построении модели.

Интерпретация кода

Рассказывать особо нечего, давайте посмотрим на код по секциям:

  1. Импортируйте соответствующий пакет Python, здесь мы используем tensorflow и numpy.
# tensorflow简单示例
import tensorflow as tf
import numpy as np
  1. Используйте numpy для генерации случайных точек 1000. Для использования numpy вы можете просмотреть мойзаметки серии numpy
# 使用numpy生成1000个随机点
x_data = np.random.rand(1000)
y_data = x_data*0.1+0.2         # 真实值
  1. построить линейную модель
# 构造一个线性模型
b = tf.Variable(0.)
k = tf.Variable(0.)
y = k*x_data+b                  # 预测值
  1. Определите функцию потерь для оценки y реальная стоимостьи ты Предполагаемая стоимостьРазрыв между
# 二次代价函数(损失函数)
loss = tf.reduce_mean(tf.square(y_data-y))

Объясните значение каждой части по очереди:

  • y_data-y: Здесь нечего объяснять, просто разница между фактическим значением и прогнозируемым значением
  • tf.square: Функция этой функции состоит в том, чтобы найти квадрат
  • tf.reduce_mean: Функция используется для вычисления среднего значения тензора тензора вдоль заданной числовой оси (размерность тензора), которая в основном используется для уменьшения размерности или вычисления среднего значения тензора (изображения).

Таким образом, три вышеуказанные функции объединяются для расчета величины убытка.

  1. использоватьGradientDescentOptimizerкласс для создания оптимизатора для оптимизации модели, уменьшенияlossзначение, принцип этого класса - градиентный спуск.Что касается градиентного спуска, вы можете обратиться к другим учебникам, которые будут представлены в будущем, если вы знаете, как его написать.
# 定义一个梯度下降法来进行训练的优化器
optimizer = tf.train.GradientDescentOptimizer(0.2)
  1. используйте оптимизатор, чтобы уменьшитьlossценность,minimizeэто метод оптимизатора
# 定义一个最小化代价函数
train = optimizer.minimize(loss)
  1. Инициализировать все переменные выше
# 初始化变量
init = tf.global_variables_initializer()
  1. использоватьSessionобучить нашу модель
with tf.Session() as sess:	# 定义会话上下文
    sess.run(init)	# 执行初始化操作
    for step in range(3000):  # 训练3000次
        sess.run(train)	# 执行训练操作
        if step % 20 == 0:	# 每隔20步
            print(step, sess.run([k, b]))	# 打印出k和b的值

На данный момент завершена одна из простейших линейных моделей. Вот весь код:

# tensorflow简单示例
import tensorflow as tf
import numpy as np

# 使用numpy生成1000个随机点
x_data = np.random.rand(1000)
y_data = x_data*0.1+0.2         # 真实值

# 构造一个线性模型
b = tf.Variable(0.)
k = tf.Variable(0.)
y = k*x_data+b                  # 预测值

# 二次代价函数(损失函数)
loss = tf.reduce_mean(tf.square(y_data-y))
# 定义一个梯度下降法来进行训练的优化器
optimizer = tf.train.GradientDescentOptimizer(0.2)
# 定义一个最小化代价函数
train = optimizer.minimize(loss)

# 初始化变量
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for step in range(3000):
        sess.run(train)
        if step % 20 == 0:
            print(step, sess.run([k, b]))

Несколько скриншотов результатов работы:

训练0-240次的结果

训练2700-2980次的结果

Из приведенных выше двух рисунков ясно видно, что когда обучение достигает 2980-го раза, результат k очень и очень близок к 0,1, а b также очень и очень близок к 0,2, Видно, что эта модель еще относительно правильно.