Компьютерное зрение — введение в TensorFlow (5)

TensorFlow Python Нейронные сети компьютерное зрение

1. Основное использование

Чтобы использовать TensorFlow, вы должны понимать TensorFlow:

1. Используйте график (Graph) для представления вычислительных задач.
2. Выполните график в контексте, называемом сеансом.
3. Используйте тензоры для представления данных.
4. Поддерживайте состояние через переменные.
5. Используйте подачу и выборку для присвоения значений или извлечения данных из произвольных операций.

1. График (График)

Вычислительный граф - это основной метод обработки в вычислительной алгебре.Мы можем представить заданное математическое выражение через ориентированный граф и можем быстро и легко вывести переменные в выражении в соответствии с характеристиками графа. Суть нейронной сети — многослойная составная функция, поэтому ее выражение также можно представить в виде графика.

Этот раздел в основном суммирует реализацию вычислительных графов.В направленном графе вычислительных графов каждый узел op (сокращение от операции) представляет определенную операцию, такую ​​как суммирование, произведение, векторное произведение, квадрат и т. д., например, выражение суммированияf(x,y)=x+yИспользуйте направленный граф для представления:

выражениеf(x,y,z)=z(x+y)Используйте направленный граф для представления:

Но в 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]]