Как работает TensorFlow?

  • TensorFlow определяет вычисления как графики, и они выполняются с помощью операций (также известных как «операции»). Итак, когда мы работаем с TensorFlow, это то же самое, что определение серии операций в Graph.
  • Чтобы выполнить эти операции как вычисления, мы должны запустить Graph в сеансе. Сеанс транслирует и передает операции, представленные на графиках, устройству, на котором вы хотите их выполнять, будь то графический процессор или процессор.
  • Например, на изображении ниже представлен график в TensorFlow. W, x и b - тензоры по ребрам этого графа. MatMul - это операция над тензорами W и x, после чего вызывается Добавить и добавляет результат предыдущий оператор с b. Результирующие тензоры каждой операции пересекают следующую до конца, где можно получить желаемый результат.

Импорт TensorFlow

Чтобы использовать TensorFlow, нам нужно импортировать библиотеку. Мы импортировали его и, при желании, дали ему имя «tf», чтобы модули были доступны по tf.module-name:

import tensorflow as tf

Построение графика

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

graph1 = tf.Graph()

Теперь мы вызываем функции TensorFlow, которые создают новые объекты tf.Operation и tf.Tensor, и добавляем их в graph1. Как уже упоминалось, каждая tf.Operation является узлом, а каждый tf.Tensor является ребром в графе.

Давайте добавим к нашему графику 2 константы. Например, вызов tf.constant ([2], name = ‘constant_a’) добавляет одну tf.Operation к графику по умолчанию. Эта операция возвращает значение 2 и возвращает tf.Tensor, представляющий значение константы.
Примечание: tf.constant ([2], name = ”Constant_a”) создает новую tf.Operation с именем «constant_a» и возвращает tf.Tensor с именем «constant_a: 0».

with graph1.as_default():
    a = tf.constant([2], name = 'constant_a')
    b = tf.constant([3], name = 'constant_b')

Посмотрите на тензор a

a

Как видите, он просто показывает имя, форму и тип тензора на графике. Мы увидим его ценность, когда запустим его в сеансе TensorFlow.

# Printing the value of a
sess = tf.Session(graph = graph1)
result = sess.run(a)
print(result)
sess.close()

Теперь давайте поработаем над этими тензорами. Функция tf.add () добавляет два тензора (вы также можете использовать c = a + b).

with graph1.as_default():
    c = tf.add(a, b)
    #c = a + b is also a way to define the sum of the terms

Затем TensorFlow необходимо инициализировать сеанс для запуска нашего кода. В каком-то смысле сеансы - это контекст для создания графика внутри TensorFlow. Давайте определим нашу сессию:

sess = tf.Session(graph = graph1)

Давайте запустим сеанс, чтобы получить результат предыдущей определенной операции «c»:

result = sess.run(c)
print(result)

Закройте сеанс, чтобы освободить ресурсы:

sess.close()

Чтобы не закрывать сеансы каждый раз, мы можем определить их в блоке with, чтобы после запуска блока with сеанс закрывался автоматически:

with tf.Session(graph = graph1) as sess:
    result = sess.run(c)
    print(result)

Даже этот глупый пример добавления двух констант для достижения простого результата определяет основу TensorFlow. Определите свои операции (в данном случае наши константы и tf.add) и запустите сеанс для построения графика.

Определение многомерных массивов с помощью TensorFlow

Теперь попробуем определить такие массивы с помощью TensorFlow:

graph2 = tf.Graph()
with graph2.as_default():
    Scalar = tf.constant(2)
    Vector = tf.constant([5,6,2])
    Matrix = tf.constant([[1,2,3],[2,3,4],[3,4,5]])
    Tensor = tf.constant( [ [[1,2,3],[2,3,4],[3,4,5]] , [[4,5,6],[5,6,7],[6,7,8]] , [[7,8,9],[8,9,10],[9,10,11]] ] )
with tf.Session(graph = graph2) as sess:
    result = sess.run(Scalar)
    print ("Scalar (1 entry):\n %s \n" % result)
    result = sess.run(Vector)
    print ("Vector (3 entries) :\n %s \n" % result)
    result = sess.run(Matrix)
    print ("Matrix (3x3 entries):\n %s \n" % result)
    result = sess.run(Tensor)
    print ("Tensor (3x3x3 entries) :\n %s \n" % result)

tf.shape возвращает форму нашей структуры данных.

Scalar.shape
Matrix.shape
Tensor.shape

Теперь поэкспериментируйте с некоторыми предыдущими функциями, чтобы увидеть, как они будут себя вести в соответствии с их типами структуры:

graph3 = tf.Graph()
with graph3.as_default():
    Matrix_one = tf.constant([[1,2,3],[2,3,4],[3,4,5]])
    Matrix_two = tf.constant([[2,2,2],[2,2,2],[2,2,2]])
addc = a + boperation = tf.add(Matrix_one, Matrix_two)
    add_2_operation = Matrix_one + Matrix_two
with tf.Session(graph =graph3) as sess:
    result = sess.run(addc = a + boperation)
    print ("Defined using tensorflow function :")
    print(result)
    result = sess.run(add_2_operation)
    print ("Defined using normal expressions :")
    print(result)

С помощью определения обычного символа, а также функции TensorFlow мы смогли получить поэлементное умножение, также известное как произведение Адамара. Но что, если нам нужен обычный матричный продукт? Затем нам нужно использовать другую функцию TensorFlow под названием tf.matmul ():

graph4 = tf.Graph()
with graph4.as_default():
    Matrix_one = tf.constant([[2,3],[3,4]])
    Matrix_two = tf.constant([[2,3],[3,4]])
mul_operation = tf.matmul(Matrix_one, Matrix_two)
with tf.Session(graph = graph4) as sess:
    result = sess.run(mul_operation)
    print ("Defined using tensorflow function :")
    print(result)

Мы также могли бы определить это умножение сами, но есть функция, которая это уже делает, так что не нужно изобретать велосипед!

Переменные

Теперь, когда мы более знакомы со структурой данных, мы рассмотрим, как TensorFlow обрабатывает переменные. Прежде всего, при наличии тензоров, зачем нам переменные?
Переменные TensorFlow используются для обмена и сохранения некоторых статистических данных, которыми манипулирует наша программа. То есть, когда вы определяете переменную, TensorFlow добавляет к вашему графику tf.Operation. Затем эта операция сохранит доступное для записи значение тензора, которое сохраняется между вызовами tf.Session.run. Таким образом, вы можете обновлять значение переменной при каждом запуске, в то время как вы не можете обновлять тензор (например, тензор, созданный tf.constant ()) через несколько запусков в сеансе.

Как определить переменную?
Для определения переменных мы используем команду tf.Variable (). Чтобы иметь возможность использовать переменные в графе вычислений, необходимо инициализировать их перед запуском графа в сеансе. Для этого нужно запустить tf.global_variables_initializer ().

Чтобы обновить значение переменной, мы просто запускаем операцию присваивания, которая присваивает значение переменной:

v = tf.Variable(0)

Давайте сначала создадим простой счетчик, переменную, которая увеличивается на одну единицу за раз:

Для этого мы используем команду tf.assign (reference_variable, value_to_update). tf.assign принимает два аргумента: reference_variable для обновления и присваивает его value_to_update.

update = tf.assign(v, v+1)

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

init_op = tf.global_variables_initializer()

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

with tf.Session() as session:
    session.run(init_op)
    print(session.run(v))
    for _ in range(3):
        session.run(update)
        print(session.run(v))

Заполнители

Теперь мы знаем, как управлять переменными внутри графа TensorFlow, но как насчет подачи данных за пределы графа TensorFlow?

Если вы хотите передать данные в граф TensorFlow извне графа, вам нужно будет использовать заполнители.

Итак, что это за заполнители и для чего они нужны?

Заполнители можно рассматривать как «дыры» в вашей модели, «дыры», в которые вы будете передавать данные, вы можете создать их с помощью
tf.placeholder (datatype) , где тип данных указывает тип данных (целые числа, числа с плавающей запятой, строки, логические значения) вместе с их точностью (8, 16, 32, 64) бит.

Определение каждого типа данных с соответствующим синтаксисом Python определяется как:

Итак, здесь мы создаем заполнитель:

a = tf.placeholder(tf.float32)

И определите простую операцию умножения:

b = a * 2

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

Чтобы передать данные в модель, мы вызываем сеанс с дополнительным аргументом feed_dict, в котором мы должны передать словарь с каждым именем заполнителя, за которым следуют соответствующие данные, вот так:

with tf.Session() as sess:
    result = sess.run(b,feed_dict={a:3.5})
    print (result)

Поскольку данные в TensorFlow передаются в виде многомерных массивов, мы можем передавать любой тензор через заполнители, чтобы получить ответ на простую операцию умножения:

dictionary={a: [ [ [1,2,3],[4,5,6],[7,8,9],[10,11,12] ] , [ [13,14,15],[16,17,18],[19,20,21],[22,23,24] ] ] }
with tf.Session() as sess:
    result = sess.run(b,feed_dict=dictionary)
    print (result)

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

tf.constant, tf.matmul, tf.add, tf.nn.sigmoid - это некоторые из операций. в TensorFlow. Они похожи на функции в Python, но работают непосредственно с тензорами, и каждая из них выполняет определенную функцию.

graph5 = tf.Graph()
with graph5.as_default():
    a = tf.constant([5])
    b = tf.constant([2])
    c = tf.add(a,b)
    d = tf.subtract(a,b)
with tf.Session(graph = graph5) as sess:
    result = sess.run(c)
    print ('c =: %s' % result)
    result = sess.run(d)
    print ('d =: %s' % result)

tf.nn.sigmoid - это функция активации, она немного сложнее, но эта функция помогает обучающимся моделям оценить, какая информация полезна, а какая нет.

Ссылка:

Http://jrmeyer.github.io/tutorial/2016/02/01/TensorFlow-Tutorial.html
https://www.tensorflow.org/versions/r0.9/api_docs/python/ index.html
https://www.tensorflow.org/versions/r0.9/resources/dims_types.html
https://en.wikipedia.org/wiki/Dimension
https://book.mql4.com/variables/arrays
https://msdn.microsoft.com/en-us/library/win