1. Основное использование
Чтобы использовать TensorFlow, вы должны понимать TensorFlow:
1. Используйте график (Graph) для представления вычислительных задач.
2. Выполните график в контексте, называемом сеансом.
3. Используйте тензоры для представления данных.
4. Поддерживайте состояние через переменные.
5. Используйте подачу и выборку для присвоения значений или извлечения данных из произвольных операций.
1. График (График)
Вычислительный граф - это основной метод обработки в вычислительной алгебре.Мы можем представить заданное математическое выражение через ориентированный граф и можем быстро и легко вывести переменные в выражении в соответствии с характеристиками графа. Суть нейронной сети — многослойная составная функция, поэтому ее выражение также можно представить в виде графика.
Этот раздел в основном суммирует реализацию вычислительных графов.В направленном графе вычислительных графов каждый узел op (сокращение от операции) представляет определенную операцию, такую как суммирование, произведение, векторное произведение, квадрат и т. д., например, выражение суммированияИспользуйте направленный граф для представления:
выражениеИспользуйте направленный граф для представления:
Но в TensorFlow программы обычно организованы в фазу сборки и фазу выполнения.На этапе сборки этапы выполнения операции описываются в виде графа.На этапе выполнения операции в графе выполнения выполняются с использованием сеансов.
Например, обычно создается граф для представления и обучения нейронной сети на этапе построения, а затем многократно выполняются обучающие операции в графе на этапе выполнения.
2. Схема конструкции
Первым шагом в построении графа является создание исходной операции (исходной операции).Исходная операция не требует каких-либо входных данных, таких как константа (Constant).Вывод исходной операции передается другим операциям для выполнения операций.
В библиотеке Python возвращаемое значение конструктора операций представляет собой выходные данные сконструированной операции, и эти возвращаемые значения могут быть переданы другим конструкторам операций в качестве входных данных.
В библиотеке TensorFlow Python есть граф по умолчанию, к которому конструктор операций может добавлять узлы.Этого графа по умолчанию достаточно для многих программ.
Ссылка API класса Graph: http://www.tensorfly.cn/tfdoc/api_docs/python/framework.html#Graph
import tensorflow as tf
# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])
# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.],[2.]])
# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)
График по умолчанию теперь имеет три узла, две операции Constant() и операцию matmul(). Чтобы фактически выполнить матричное умножение и получить результат матричного умножения, вы должны запустить граф в сеансе.
3. Запустите график в сеансе
Граф нельзя запустить, пока не будет завершена фаза построения.Первым шагом в запуске графа является создание объекта сеанса, если параметры создания отсутствуют, конструктор сеанса запустит граф по умолчанию. Ссылка API сеанса: http://www.tensorfly.cn/tfdoc/api_docs/python/client.html#session-management
# 启动默认图.
sess = tf.Session()
# 调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数.
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回
# 矩阵乘法 op 的输出.
#
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
#
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
#
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print (result)
# ==> [[ 12.]]
# 任务完成, 关闭会话.
sess.close()
результат:
[[12.]]
Объект Session должен быть закрыт, чтобы высвободить ресурсы после использования.Помимо явного вызова закрытия, блок with можно использовать для автоматического завершения действия закрытия.
with tf.Session() as sess:
result = sess.run([product])
print (result)
результат:
[array([[12.]], dtype=float32)]
2. Константы и переменные
(1) Константы
data1 = tf.constant(2,dtype = tf.int32)
print(data1)
sess = tf.Session()
print(sess.run(data1))
# Tensor 是张量, shape 是维度, dtype 是数据类型 ,tf.Variable 是变量
результат:
Tensor("Const_6:0", shape=(), dtype=int32)
2
(2) Переменные
data2 = tf.Variable(10,name='var')
print(data2)
sess = tf.Session()
init = tf.global_variables_initializer()
# 如果不初始化会报错
sess.run(init)
print(sess.run(data2))
результат:
<tf.Variable 'var_6:0' shape=() dtype=int32_ref>
10
3. Четыре операции над постоянными переменными
1. Четыре арифметических операции над константами
data3 = tf.constant(6)
data4 = tf.constant(2)
dataAdd = tf.add(data3,data4) # 加
dataSub = tf.subtract(data3,data4) # 减
dataMul = tf.multiply(data3,data4) # 乘
dataDiv = tf.divide(data3,data4) # 除
with tf.Session() as sess:
print (sess.run(dataAdd))
print (sess.run(dataSub))
print (sess.run(dataMul))
print (sess.run(dataDiv))
print('End!')
результат:
8
4
12
3.0
End!
2. Четыре арифметических операции над переменными
data5 = tf.constant(6)
data6 = tf.Variable(4)
dataAdd = tf.add(data5,data6) # 加
dataCopy = tf.assign(data6,dataAdd)
# 把dataAdd的运算结果,赋值到data6
dataSub = tf.subtract(data5,data6) # 减
dataMul = tf.multiply(data5,data6) # 乘
dataDiv = tf.divide(data5,data6) # 除
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print ('加:',sess.run(dataAdd))
print ('减:',sess.run(dataSub))
print ('乘:',sess.run(dataMul))
print ('除:',sess.run(dataDiv))
print ('dataCopy :',sess.run(dataCopy))
# dataAdd = 10
print ('dataCopy.eval() :',dataCopy.eval())
# eval(expression[, globals[, locals]]) , 用来执行一个字符串表达式,并返回表达式的值
# dataAdd + data5 = 10 + 6 = 16
print ('tf.get_default_session() :',tf.get_default_session().run(dataCopy))
# dataCopy + data5 = 16 + 6 = 22
print('End!')
результат:
加: 10
减: 2
乘: 24
除: 1.5
dataCopy : 10
dataCopy.eval() : 16
tf.get_default_session() : 22
End!
В-четвертых, матричный базис
1. Матричная операция
Пример первый:
data1 = tf.placeholder(tf.float32)
data2 = tf.placeholder(tf.float32)
dataAdd = tf.add(data1,data2)
with tf.Session() as sess:
print(sess.run(dataAdd,feed_dict={data1:6,data2:2}))
print('End!')
результат:
8.0
End!
Пример второй:
data3 = tf.constant([[6,6]])
data4 = tf.constant([[2],
[2]])
data5 = tf.constant([[3,3]])
data6 = tf.constant([[1,2,3],
[4,5,6],
[7,8,9]])
print('data6.shape:',data6.shape) # 维度
with tf.Session() as sess:
print('data6:',sess.run(data6)) # 打印整体
print('data6[0]:',sess.run(data6[0])) # 打印第一行
print('data6[1,:]:',sess.run(data6[1,:])) # 第二行
print('data6[:,1]:',sess.run(data6[:,1])) # 第二列
print('data6[0,1]:',sess.run(data6[0,1])) # 第一行第二列
результат:
data6.shape: (3, 3)
data6: [[1 2 3]
[4 5 6]
[7 8 9]]
data6[0]: [1 2 3]
data6[1,:]: [4 5 6]
data6[:,1]: [2 5 8]
data6[0,1]: 2
2. Матричные операции
(1) Добавление tf.add()
Обычное сложение матриц определяется на двух матрицах одинакового размера. Сумма двух матриц A и B размера m×n, отмеченных как A+B, также является матрицей размера m×n, и каждый элемент в ней представляет собой значение после добавления соответствующего элемента. Например:
(2) Вычитание tf.subtract()
Вы также можете выполнять матричное вычитание, если они имеют одинаковый размер. Каждый элемент в A-B представляет собой значение после вычитания соответствующего элемента, и эта матрица будет иметь тот же размер, что и A и B. Например:
(3) Умножение tf.multiply()
Пусть A — матрица размера m×p, а B — матрица размера ap×n, тогда матрица C называется произведением матриц размера m×n A и B, обозначаемым как C=AB, где i-я строка и j-я й столбец в матрице C Elements может быть представлен как:
Следующее:
(4) Произведение — произведение Адамара tf.matmul()
Адамара A с матрицей размера m×n A=[a ij] и матрицей размера m×n B=[b ij]Накопление B записывается как . Его элементы определяются как произведение соответствующих элементов двух матриц (AB) Матрица размера m×n ij=aij bij. Например,
data1 = tf.constant([[6,6]])
data2 = tf.constant([[2],
[2]])
data3 = tf.constant([[3,3],
[2,2]])
data4 = tf.constant([[1,2],
[3,4],
[5,6]])
data5 = tf.constant([[1,1],
[2,2]])
matMul = tf.matmul(data3,data5)
matMul2 = tf.multiply(data1,data2)
matAdd = tf.add(data1,data4)
with tf.Session() as sess:
print('matMul:',sess.run(matMul))
print('matMul2:',sess.run(matMul2))
print('matAdd:',sess.run(matAdd))
результат:
matMul: [[9 9]
[6 6]]
matMul2: [[12 12]
[12 12]]
matAdd: [[ 7 8]
[ 9 10]
[11 12]]