深度学习应用开发-TensorFlow实践笔记(三)——TensorFlow篇

说明:本文是学习浙江大学吴明晖老师等开设的慕课<深度学习应用开发-TensorFlow实践>的学习笔记,写博客方便复习

文章目录

  • TensorFlow概念
  • 创建流图(计算图)
    • 计算图中的操作
  • 会话(session)
    • 会话模式一
    • 会话模式二
      • 交互环境下,设置默认会话来获取张量的取值会更加方便
  • 常量(constant)
  • 变量(variable)
    • 变量赋值
  • 占位符(Placeholder)
    • Feed提交数据,Fetch提取数据

TensorFlow概念

TensorFlow是一个通过计算图的形式表述计算的编程系统,张量(tensor)+流(flow)
计算图是一个有向图,由一组节点(每个节点代表一个操作)和一组有向边(每条边代表节点之间的关系)构成

#一个简单计算图
import tensorflow as tf      #引入tensorflow库
node1=tf.constant(3.0,tf.float32,name='node1')  #定义一个名称为node1,类型为float32,大小为3.0的常量
node2=tf.constant(4.0,tf.float32,name='node2')
node3=tf.add(node1,node2)  #两个常量相加
print(node3)

输出:Tensor(“Add_1:0”, shape=(), dtype=float32)
输出的结果不是一个具体的数字,而是一个张量结构,张量没有储存数字.

创建流图(计算图)

要想显示上一段代码的具体的结果,需要建立对话、执行对话才可以显示运行结果

#建立对话并显示运行结果
sess=tf.Session()
print("运行sess.run(node3)的结果是:",sess.run(node3))
#关闭session
sess.close()

输出:运行sess.run(node3)的结果是: 7.0

以最最最常用的Hello,World!为例:
(TensorFlow是这样子写的)

import tensorflow as tf
hello=tf.constant("Hello,World")
sess=tf.Session()
print(sess.run(hello))

接下来看看这个例子:

import tensorflow as tf
tens1=tf.constant([[[1,2,2],[2,2,3]],
                    [[3,5,6],[5,4,3]],
                     [[7,0,1],[9,1,9]],
                   [[11,12,7],[1,3,14]]],name="tens1")

print(tens1)

输出:Tensor(“tens1:0”, shape=(4, 2, 3), dtype=int32)
关键看看这个shape里的数的含义,首先shape里有3个元素,代表tens1是一个三维数组,从最外层括号开始看,次外层有4个元素,次次外层有2个元素,最小的括号里有3个元素,于是乎[4,2,3]代表着一个三维数组中有4个二维数组,一个二维数组中有2个一维数组,一个一维数组中有3个元素。

还有一个问题,我怎么取数组中的数呢?

#创建会话
sess=tf.Session()
print(sess.run(tens1)[1,0,2])
sess.close()
#下标从0开始
6

输出其实就是[3,5,6]中的6
补充:不带小数点的数会被默认为int32;带小数点的会被默认为float32
TensorFlow会对参与运算的所有张量进行类型的检查,发现类型不匹配时会报错

计算图中的操作

import tensorflow as tf
tf.reset_default_graph()
a=tf.Variable(1,name="a")
b=tf.add(a,1,name="b")
c=tf.multiply(b,4,name="c")
d=tf.subtract(c,b,name="d")

logdir='D:/log'

#生成一个写日志的writer,并将当前的TensorFlow计算图写入日志
writer=tf.summary.FileWriter(logdir,tf.get_default_graph())
writer.close()     

深度学习应用开发-TensorFlow实践笔记(三)——TensorFlow篇_第1张图片
进入tensorboard就可以看到如上计算图
TensorBoard不需要额外安装没在安装TensorFlow的时候就已经自动安装了
在Anaconda里打开TensorBoard的步骤是:1.打开Anaconda Prompt进入日志存放目录
2.输入命令:tensorboard --logdir=/path/log
3.复制输出的网址到浏览器即可

会话(session)

会话模式一

import tensorflow as tf
tens2=tf.constant([1,2,3])

#创建一个会话
sess=tf.Session()

#下面两个命令有相同的功能
print(sess.run(tens2))
#print(result.eval(session=sess))
#关闭会话使得本次运行中使用的资源可以被释放
sess.close()

会话模式二

import tensorflow as tf
node1=tf.constant(3.0,tf.float32,name='node1')
node2=tf.constant(4.0,tf.float32,name='node2')
result=tf.add(node1,node2)

#创建一个会话,并通过python中的上下文管理器来管理这个会话
with tf.Session() as sess:
    #使用这个创建好的会话来计算关心的结果
    print(sess.run(result))

#不需要再调用Session.close()函数来关闭会话
#当上下文退出时会话关闭和资源释放也自动完成了
import tensorflow as tf
node1=tf.constant(3.0,tf.float32,name='node1')
node2=tf.constant(4.0,tf.float32,name='node2')
result=tf.add(node1,node2)
#新建一个会话
sess=tf.Session()
with sess.as_default():
#将会话指定为默认的会话
    print(result.eval())

交互环境下,设置默认会话来获取张量的取值会更加方便

tf.InteractiveSession使用这个函数会自动将生成的会话注册为默认会话

import tensorflow as tf
node1=tf.constant(3.0,tf.float32,name='node1')
node2=tf.constant(4.0,tf.float32,name='node2')
result=tf.add(node1,node2)

sess=tf.InteractiveSession()

print(result.eval())
sess.close()

常量(constant)

运行过程中值不会改变的单元,在TensorFlow中无须进行初始化操作
创建语句:constant_name=tf.constant(value)

变量(variable)

在运行过程中值会改变的单元,在TensorFlow中须进行初始化操作
创建语句:name_variable=tf.Variable(value,name)
个别变量初始化:
init_op=name_variable.initializer()
所有变量初始化:
init_op=tf.global_variables_initializer()

变量赋值

TensorFlow中的变量定义后,一般无须人工赋值,系统会根据算法模型,训练优化过程中自动调整变量对应的数值
特殊情况下需要人工更新的,可用变量赋值语句epoch=tf.Variable(0,name=‘epoch’,trainable=False)
变量更新语句:update_op=tf.assign(variable_to_be_updated,new_value)

import tensorflow as tf
value=tf.Variable(0,name='value')
one=tf.constant(1,name='one')
new_value=tf.add(value,one)
update_value=tf.assign(value,new_value)
sum_value=tf.Variable(0,name='sum_value')
tem_value=tf.add(sum_value,value)
update_sum_value=tf.assign(sum_value,tem_value)

init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for _ in range(10):
        sess.run(update_value)
        sess.run(update_sum_value)
    print(sess.run(sum_value))

占位符(Placeholder)

tf.placeholder占位符,是一种Tensorflow中特有的一种数据结构,类似动态变量,函数的参数、或者C语言,python语言中的格式化输出时的“%”占位符
TensorFlow占位符Placeholder,先定义一种数据,其参数为数据的Type和Shape
占位符Placeholder的函数接口如下:
tf.placeholder(dtype,shape=None,name=None)

x=tf.placeholder(tf.float32,[2,3],name=‘tx’)
#此代码生成一个2x3的二维数组,矩阵中的每个元素的类型都是tf.float32,内部对应的符号名称是tx

Feed提交数据,Fetch提取数据

import tensorflow as tf
a=tf.placeholder(tf.float32,name='a')
b=tf.placeholder(tf.float32,name='b')
c=tf.multiply(a,b,name='c')

init=tf.global_variables_initializer()

with tf.Session() as sess:
    #sess.run(init)
    #通过feed_dict的参数传值,按字典格式
    result=sess.run(c,feed_dict={a:8.0,b:3.5})
    print(result)

多次操作可以通过一次feed完成执行,placeholder不能与变量等同,不需要初始化

import tensorflow as tf 
a=tf.placeholder(tf.float32,name='a')
b=tf.placeholder(tf.float32,name='b')
c=tf.multiply(a,b,name='c')
d=tf.subtract(a,b,name='d')

#init=tf.global_variables_initializer()
with tf.Session() as sess:
#     sess.run(init)
    result=sess.run([c,d],feed_dict={a:[5.0,8.5,7.0],b:[2.0,6.0,4.5]})
        #返回两个值分别赋给两个变量
    rc,rd=sess.run([c,d],feed_dict={a:[6.5,8.5,7.0],b:[2.0,5.5,4.5]})
    print(result)
    print(result[1])
    print("value of c=",rc,"value of d=",rd)

你可能感兴趣的:(学习笔记,tensorflow,tensorflow)