Начало работы с машинным обучением с TensorFlow

машинное обучение искусственный интеллект TensorFlow алгоритм
Начало работы с машинным обучением с TensorFlow

Спереди написано: Идите в ногу со временем, начните изучать машинное обучение и постарайтесь увидеть больше того, как выглядят все направления до выпуска, и обнаружите, что это перспективная и интересная область (кенг). // Затем начинаем заполнять математику...

0 Введение в TensorFlow

Я только начинаю, но у меня нет глубокого понимания Просто прочитайте официальное введение.

GitHub Description: Computation using data flow graphs for scalable machine learning

Официальный сайт: TensorFlow^{^{TM}}— это библиотека программного обеспечения с открытым исходным кодом для численных вычислений с использованием графов потока данных. Узлы в графе представляют собой математические операции, а ребра в графе представляют собой многомерные массивы (тензоры), передаваемые между этими узлами.

0.1 Что такое TensorFlow?

Tensorсмысл тензора,Flowозначает поток. Поэтому его можно непосредственно рассматривать как библиотеку с открытым исходным кодом для вычислений с использованием графа потока данных, состоящего из тензоров.

0.2 Что может TensorFlow?

В настоящее время он используется в основном для машинного обучения, что немного недружелюбно к людям.Автор понимает, что можно преобразовать данные в векторные описания и построить соответствующие графы вычислительных потоков. Например, я не знаю, правильно это или нет. Например, мы рассчитываем(1 + 2)*3-4, можно построить бинарное дерево

Обход этого двоичного дерева по порядку представляет собой приведенное выше выражение, что означает, что это выражение может быть преобразовано в граф, подобный двоичному дереву, иTensorFlowЭтот график вполне можно рассчитать. Код приведен ниже.Неважно, если вы его не понимаете, если вы понимаете, что поток кода представляет собой расчет графа (бинарного дерева), в следующей главе будет рассказано, как его использовать.TensorFlow.

# coding: utf-8
import tensorflow as tf

a, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4)
add = tf.add(a,b)
mul = tf.multiply(add, c)
sub = tf.subtract(mul, d)
with tf.Session() as sess:
    print(sess.run(sub))
# output: 
# 5

0.3 Установка TensorFlow

Я не буду вдаваться в подробности здесь, я считаю, что вы должны иметь работающую среду, когда вы нажимаете на эту статью. Если нет, вот два рекомендуемых сайтаАнглийский: Официальный сайтиКитайский: ** Переводчик колледжаЗатем представьте мою среду:Anaconda + PyCharm

УведомлениеPyCharm:\ Project\ InterpreterУстановить какConda\ EnvironmentбежатьTensorFlow. Если вы не знаете, как читать дополнительные онлайн-учебники, вы можете получить более глубокое представление о виртуальной среде.

1 Знакомство с TensorFlow

Ну, с предыдущим введением вы должны быть в состоянии использоватьTensorFlowсреду, давайте начнем знакомить с кодом.

1.1 Основной синтаксис

На самом деле грамматика не точна, грамматикаPythonСинтаксис (здесь используется Python) в основном представляет вызов этой библиотеки вычислений для реализации этого специального вычисления. поставить то же самоеУчебник на официальном сайте

1.1.1 Введение в вычислительные устройства

Видно, что в расчетном графе есть два основных содержимого: точки (листовые и нелистовые узлы) и линии. Насколько я понимаю, точки представляют данные, а линии представляют операции. Не знаю, правильно это или нет, но объясню так. Вот некоторые часто используемые «точки»:

常量

c = tf.constant(2)

变量

v = tf.Variable(2)

占位符

p = tf.placeholder(tf.float32)

Вышеуказанные коды все параметры передаются по принципу минимального юзабилити.Если вам интересно можете перейти к исходникам.Здесь мы в основном идем кPythonПоднимите синтаксис, сначала используйте его, а затем исследуйте, почему необходимо проектировать такую ​​структуру данных для расчетного графа.

Далее идут «строки»:

四则运算

add = tf.add(a, b)
sub = tf.subtract(a, b)
mul = tf.multiply(a, b)
div = tf.divide(a, b)

Другие не будут представлены, подробности можно увидетьXXX\_ ops.pyисходный код. Например, описанная выше операция определена вmath\_ ops.py.

1.1.2 Введение в процесс расчета

Зная общие данные и методы расчета, процесс расчета описан ниже:

# coding: utf-8
import tensorflow as tf

# Step1: 创建数据
a, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4)

# Step2: 构造计算图
add = tf.add(a,b)
mul = tf.multiply(add, c)
sub = tf.subtract(mul, d)

# Step3: 进行计算
with tf.Session() as sess:
    print(sess.run(sub))

Приведенный выше пример представляет собой стандартный процесс расчета констант, вы можете попробоватьprint(a, add)Посмотрите, что вы создали, вы обнаружите, что этоTensorИ ценность внутри0. Можно догадаться, что здесь не рассчитывается только печать, см.TensorИсходный код:

# ops.py
def __repr__(self):
    return "<tf.Tensor '%s' shape=%s dtype=%s>" % (self.name, self.get_shape(),self._dtype.name)

@property
def name(self):
    """The string name of this tensor."""
    if not self._op.name:
        raise ValueError("Operation was not named: %s" % self._op)
    return "%s:%d" % (self._op.name, self._value_index)

Научился вычислять константы, переменные уже не те? Если вы пробовали, то знаете, что это не то же самое, переменную нужно инициализировать.

v = tf.Variable(2)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(v, sess.run(v))

В этот момент вам может быть интересно, в чем разница между переменными и константами? Из буквального смысла может быть известно, что переменная должна быть переменной, что нам удобно для настройки параметров в любой момент в процессе расчета.Ниже описано, как это использовать через кусок кода.

v = tf.Variable(2)
# 将 v 的值自乘 2
update = tf.assign(v, tf.multiply(v, tf.constant(2)))
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for _ in range(4):
        print("-----------------------")
        print "Before : ", sess.run(v)
        sess.run(update)
        print "After : ", sess.run(v)

# output:
# -----------------------
# Before :  2
# After :  4
# -----------------------
# Before :  4
# After :  8
# -----------------------
# Before :  8
# After :  16
# -----------------------
# Before :  16
# After :  32

Но если мы не хотим каждый раз устанавливать-обновлять-вычислять-обновлять-вычислять... а записывать данные непосредственно в вычисление, то заполнители работают. Также возьмем небольшой пример.

c = tf.constant(2)
# 注意类型一致,这里是 tf.int32
p = tf.placeholder(tf.int32)
mul = tf.multiply(c, p)
with tf.Session() as sess:
    # tmp = 2 相当于上一个例子变量的初始值是 2
    tmp = 2;
    for _ in range(4):
        # 直接填充 feed_dict
        tmp = sess.run(mul, feed_dict={p:tmp})
        print tmp

# output:
# 4
# 8
# 16
# 32

Процесс расчета кратко описан ниже:

  • Создание данных: можно создавать константы, переменные и заполнители.
  • Построить график: построить график на основе предыдущих данных.
  • Инициализировать: Инициализировать переменную.
  • Расчет: график должен быть рассчитан путем открытия сеанса.

1.2 Визуализация

TensorFlowПредоставляет инструмент визуализации -TensorBoard, давайте начнем знакомить, как его использовать.

Вот визуализация приведенного выше примера бинарного дерева.

# coding: utf-8
import tensorflow as tf

a, b, c, d = tf.constant(1), tf.constant(2), tf.constant(3),tf.constant(4)
add = tf.add(a,b)
mul = tf.multiply(add, c)
sub = tf.subtract(mul, d)
with tf.Session() as sess:
    writer = tf.summary.FileWriter('./graphs', sess.graph)
    print(sess.run(sub))
writer.close()

Затем используйте командную строку для сохраненияgraphsВыполнить в папкеtensorboard --logdir="./graphs"команду, затем следуйте инструкциям, чтобы открыть в браузереhttp://localhost:6006В случае успеха показатьTensorBoardИнтерфейс показывает успех.

2 Машинное обучение с TensorFlow

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

2.1 Линейная регрессия

Здесь мы используем наиболее известную линейную регрессию, чтобы испытать процесс машинного обучения:

2.1.1 Подготовка данных

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

train_X = numpy.asarray([1.1, 1.8, 3.2, 4.7, 5.9, 6.7])
train_Y = numpy.asarray([1.2, 2.1, 3.1, 4.6, 5.5, 6.9])

2.1.2 Построение модели

Мы используем заполнители для выполнения расчетов, и вы можете напрямую импортировать данные во время операций. Здесь, поскольку мы используем линейную регрессию, целевая функция имеет видY = XW + bЛинейная функция вида . То есть мы подбираем линию, которая соответствует распределению этих точек через заданные точки.

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

W = tf.Variable(-1., name="weight")
b = tf.Variable(-1., name="bias")

# linear model 
# activation = X*W + b
activation = tf.add(tf.multiply(X, W), b)

2.1.3 Оценка параметров

Берем разницу между ординатой, заданной каждой точкой, и ординатой, рассчитанной по линейной модели(activation - Y)сумма площадей(tf.reduce\_ sum(tf.pow(activation - Y, 2)))В качестве функции потерь в обучении используется алгоритм градиентного спуска, чтобы максимально минимизировать сумму, и выбирается скорость обучения.0.01. Математические принципы здесь не представлены, а соответствующие статьи об алгоритмах машинного обучения будут написаны в будущем. Как правило, выбор функции потерь и обновление весов с помощью некоторых методов оптимизации здесь представляет собой серьезную трудность.Если вы хотите узнать принцип, вам нужно изучить много базовых математических знаний (теория вероятностей, линейная алгебра, исчисление...) .

learning_rate = 0.01

cost = tf.reduce_sum(tf.pow(activation - Y, 2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

2.1.4 Данные для обучения

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

training_epochs = 2000
display_step = 100

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})
        if epoch % display_step == 0:
            print("Epoch:", '%04d' % (epoch + 1), "cost=",
                  "{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y: train_Y})), "W=", sess.run(W), "b=",
                  sess.run(b))
    print("Optimization Finished!")
    print("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))

2.1.5 Визуализация

Вы можете напрямую рисовать двухмерную графику, чтобы увидеть результаты. незнакомое может относиться кУчебник по Matplotlib

    writer = tf.summary.FileWriter('./graphs', sess.graph)

    plt.scatter(train_X, train_Y, color='red', label='Original data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), color='blue', label='Fitted line')
    plt.show()
writer.close()

Двумерная карта:

Диаграмма потока данных:

2.1.6 Резюме

На самом деле весь процесс очень легко понять, если не вникать в принцип.提供数据-选取拟合函数-构建图-选取损失函数-最优化-训练数据(更新权重)-得出结论. Этот процесс соответствует нашим ожиданиям от основной идеи решения задач линейной регрессии. Конечно, автор считает, что это только начало, если вы хотите углубиться, изучение необходимых математических знаний — единственный путь к машинному обучению.

Здесь вы можете обратиться кНачало работы с TensorFlowОбщий код:

# coding: utf-8
from __future__ import print_function
import tensorflow as tf
import numpy
import matplotlib.pyplot as plt

train_X = numpy.asarray([1.1, 1.8, 3.2, 4.7, 5.9, 6.7])
train_Y = numpy.asarray([1.2, 2.1, 3.1, 4.6, 5.5, 6.9])

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

W = tf.Variable(-1., name="weight")
b = tf.Variable(-1., name="bias")

activation = tf.add(tf.multiply(X, W), b)

learning_rate = 0.01

cost = tf.reduce_sum(tf.pow(activation - Y, 2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

training_epochs = 2000
display_step = 100

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})
        if epoch % display_step == 0:
            print("Epoch:", '%04d' % (epoch + 1), "cost=",
                  "{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y: train_Y})), "W=", sess.run(W), "b=",
                  sess.run(b))
    print("Optimization Finished!")
    print("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
    
    writer = tf.summary.FileWriter('./graphs', sess.graph)

    plt.scatter(train_X, train_Y, color='red', label='Original data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), color='blue', label='Fitted line')
    plt.show()
writer.close()

# output:
# Epoch: 0001 cost= 0.785177052 W= 1.07263 b= -0.448403
# Epoch: 0101 cost= 0.440001398 W= 1.02555 b= -0.0137608
# Epoch: 0201 cost= 0.437495589 W= 1.02078 b= 0.0176154
# Epoch: 0301 cost= 0.437433660 W= 1.02043 b= 0.0199056
# Epoch: 0401 cost= 0.437430561 W= 1.02041 b= 0.0200727
# Epoch: 0501 cost= 0.437429130 W= 1.0204 b= 0.0200851
# Epoch: 0601 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 0701 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 0801 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 0901 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1001 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1101 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1201 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1301 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1401 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1501 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1601 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1701 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1801 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Epoch: 1901 cost= 0.437429696 W= 1.0204 b= 0.0200854
# Optimization Finished!
# cost= 0.43743 W= 1.0204 b= 0.0200854
# 可以看到迭代次数到 500 次左右数据就稳定了。

3 Резюме

На самом деле, это только начало, предстоит еще многому научиться. Я все больше и больше чувствую важность основ, не только компьютерных основ, но и математических основ.Особенно в будущем тренде Интернета вещей кодирование может становиться все более и более размытым, просто как инструмент для некоторых профессионалов / использования навыков. Непосредственно перед выпускным я могу есть эти штуки только медленно...

4 ссылки