深度学习04-(Tensorflow简介、图与会话、张量基本操作、Tensorboard可视化、综合案例:线性回归)
深度学习04-Tensorflow
深度学习04-(Tensorflow)
Tensorflow概述
Tensorflow简介
什么是Tensorflow
Tensorflow的特点
Tensorflow发展历史
Tensorflow安装
案例1:快速开始
# tf的helloworld程序
import tensorflow as tf
hello = tf.constant('Hello, world!') # 定义一个常量
sess = tf.Session() # 创建一个session
print(sess.run(hello)) # 计算
sess.close()
案例2:张量相加
# 常量加法运算示例
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 调整警告级别
a = tf.constant(5.0) # 定义常量a
b = tf.constant(1.0) # 定义常量a
c = tf.add(a, b)
print("c:", c)
graph = tf.get_default_graph() # 获取缺省图
print(graph)
with tf.Session() as sess:
print(sess.run(c)) # 执行计算
Tensorflow体系结构
体系结构概述
单机模式与分布式模式
后端逻辑层次
基本概念
张量
数据流
操作
图和会话
变量和占位符
Tensorflow基本使用
图和会话操作
什么是图
案例3:查看图对象
# 常量加法运算示例
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 调整警告级别
a = tf.constant(5.0) # 定义常量a
b = tf.constant(1.0) # 定义常量a
c = tf.add(a, b)
print("c:", c)
graph = tf.get_default_graph() # 获取缺省图
print(graph)
with tf.Session() as sess:
print(sess.run(c)) # 执行计算
print(a.graph) # 通过tensor获取graph对象
print(c.graph) # 通过op获取graph对象
print(sess.graph) # 通过session获取graph对象
会话及相关操作
案例4:指定会话运行某个图
# 创建多个图,指定图运行
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 调整警告级别
a = tf.constant(5.0) # 定义常量a
b = tf.constant(1.0) # 定义常量a
c = tf.add(a, b)
graph = tf.get_default_graph() # 获取缺省图
print(graph)
graph2 = tf.Graph()
print(graph2)
with graph2.as_default(): # 在指定图上创建op
d = tf.constant(11.0)
with tf.Session(graph=graph2) as sess:
print(sess.run(d)) # 执行计算
# print(sess.run(c)) # 报错
会话常见的错误及原因
张量及基本运算
张量的阶与形状
张量的数据类型
张量常用属性
案例5:查看张量属性
# 创建多个图,指定图运行
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 调整警告级别
# a = tf.constant(5.0) # 定义常量a
# a = tf.constant([1,2,3])
a = tf.constant([[1,2,3],[4,5,6]])
with tf.Session() as sess:
print(sess.run(a)) # 执行计算
print("name:", a.name)
print("dtype:", a.dtype)
print("shape:", a.shape)
print("op:", a.op)
print("graph:", a.graph)
案例6:生成张量
# 创建张量操作
import tensorflow as tf
# 生成值全为0的张量
tensor_zeros = tf.zeros(shape=[2, 3], dtype="float32")
# 生成值全为1的张量
tensor_ones = tf.ones(shape=[2, 3], dtype="float32")
# 创建正态分布张量
tensor_nd = tf.random_normal(shape=[10],# 形状,1维10个元素
mean=1.7, # 期望值
stddev=0.2,# 标准差
dtype="float32")# 元素类型
# 生成和输入张量形状一样的张量,值全为1
tensor_zeros_like = tf.zeros_like(tensor_ones)
with tf.Session() as sess:
print(tensor_zeros.eval()) # eval表示在session中执行并返回值 等价于sess.run(tensor_zeros)
print(tensor_ones.eval())
print(tensor_nd.eval())
print(tensor_zeros_like.eval())
张量类型转换
案例7:张量类型转换
# 张量类型转换
import tensorflow as tf
tensor_ones = tf.ones(shape=[2, 3], dtype="int32")
tensor_float = tf.constant([1.1, 2.2, 3.3])
with tf.Session() as sess:
print(tf.cast(tensor_ones, tf.float32).eval())
# print(tf.cast(tensor_float, tf.string).eval()) #不支持浮点数到字符串直接转换
占位符
案例8:占位符使用
# 占位符示例
import tensorflow as tf
# 不确定数据,先使用占位符占个位置
plhd = tf.placeholder(tf.float32, [2, 3]) # 2行3列的tensor
plhd2 = tf.placeholder(tf.float32, [None, 3]) # N行3列的tensor
with tf.Session() as sess:
d = [[1, 2, 3],
[4, 5, 6]]
print(sess.run(plhd, feed_dict={plhd: d}))
print("shape:", plhd.shape)
print("name:", plhd.name)
print("graph:", plhd.graph)
print("op:", plhd.op)
print(sess.run(plhd2, feed_dict={plhd2: d}))
张量形状改变
案例9:修改张量形状
# 改变张量形状示例(重点)
import tensorflow as tf
pld = tf.placeholder(tf.float32, [None, 3])
print(pld)
pld.set_shape([4, 3])
print(pld)
# pld.set_shape([3, 3]) #报错,静态形状一旦固定就不能再设置静态形状
# 动态形状可以创建一个新的张量,改变时候一定要注意元素的数量要匹配
new_pld = tf.reshape(pld, [3, 4])
print(new_pld)
# new_pld = tf.reshape(pld, [2, 4]) # 报错,元素的数量不匹配
with tf.Session() as sess:
pass
张量数学计算
案例10:张量数学计算
# 数学计算示例
import tensorflow as tf
x = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
y = tf.constant([[4, 3], [3, 2]], dtype=tf.float32)
x_add_y = tf.add(x, y) # 张量相加
x_mul_y = tf.matmul(x, y) # 张量相乘
log_x = tf.log(x) # log(x)
# reduce_sum: 此函数计算一个张量的各个维度上元素的总和
x_sum_1 = tf.reduce_sum(x, axis=[1]) #0-列方向 1-行方向
# segment_sum: 沿张量的片段计算总和
# 函数返回的是一个Tensor,它与data有相同的类型,与data具有相同的形状
# 但大小为 k(段的数目)的维度0除外
data = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=tf.float32)
segment_ids = tf.constant([0, 0, 0, 1, 1, 2, 2, 2, 2, 2], dtype=tf.int32)
x_seg_sum = tf.segment_sum(data, segment_ids) # [6, 9, 40]
with tf.Session() as sess:
print(x_add_y.eval())
print(x_mul_y.eval())
print(x_mul_y.eval())
print(log_x.eval())
print(x_sum_1.eval())
print(x_seg_sum.eval())
变量
- 变量是一种op,它的值是张量
- 变量能够持久化保存,普通张量则不可
- 当定义一个变量时,需要再会话中进行初始化
- 变量创建
tf.Variable(initial_value=None,name=None)
案例11:变量的使用
# 变量OP示例
import tensorflow as tf
# 创建普通张量
a = tf.constant([1, 2, 3, 4, 5])
# 创建变量
var = tf.Variable(tf.random_normal([2, 3], mean=0.0, stddev=1.0),
name="variable")
# 变量必须显式初始化, 这里定义的是初始化操作,并没有运行
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
print(sess.run([a, var]))
Tensorboard可视化
Tensorboard工具
什么是可视化
启动tensorboard
注意事项:
- 启动Tensorboard时, 路径最好写成绝对路径
- 如果是windows, 进入python安装目录下scirpts:
tensorboard-- logdir=”C: \ \ summary \”
路径写成双反斜杠 - 在浏览器中访问时,输入: localhost : 6006
不要输入: 127.0. 0. 1 : 6006 - 如果所有的选项下都没有数据,默认会隐藏在inactive中
- 如果Tensorboard没办法运行,先装一个高版本尝试
如果还是不行,再装一个低版本的尝试
tensorboard主页说明
案例12:为操作添加可视化
# 变量OP示例
import tensorflow as tf
''' 变量OP
1. 变量OP能够持久化保存,普通张量则不可
2. 当定义一个变量OP时,在会话中进行初始化
3. name参数:在tensorboard使用的时候显示名字,可以让相同的OP进行区分
'''
# 创建普通张量
a = tf.constant([1, 2, 3, 4, 5])
# 创建变量
var = tf.Variable(tf.random_normal([2, 3], mean=0.0, stddev=1.0),
name="variable")
b = tf.constant(3.0, name="a")
c = tf.constant(4.0, name="b")
d = tf.add(b, c, name="add")
# 变量必须显式初始化, 这里定义的是初始化操作,并没有运行
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
# 将程序图结构写入事件文件
fw = tf.summary.FileWriter("../summary/", graph=sess.graph)
print(sess.run([a, var]))
- 注:张量如果未使用默认情况下不显示
摘要与事件文件操作
综合案例:实现线性回归
案例13:实现线性回归
# 线性回归示例
import tensorflow as tf
# 第一步:创建数据
x = tf.random_normal([100, 1], mean=1.75, stddev=0.5, name="x_data")
y_true = tf.matmul(x, [[2.0]]) + 5.0 # 矩阵相乘必须是二维的
# 第二步:建立线性回归模型
# 建立模型时,随机建立权重、偏置 y = wx + b
# 权重需要不断更新,所以必须是变量类型. trainable指定该变量是否能随梯度下降一起变化
weight = tf.Variable(tf.random_normal([1, 1], name="w"),
trainable=True) # 训练过程中值是否允许变化
bias = tf.Variable(0.0, name="b", trainable=True) # 偏置
y_predict = tf.matmul(x, weight) + bias # 计算 wx + b
# # 第三步:求损失函数,误差(均方差)
loss = tf.reduce_mean(tf.square(y_true - y_predict))
# # 第四步:使用梯度下降法优化损失
# 学习率是比价敏感的参数,过小会导致收敛慢,过大可能导致梯度爆炸
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#### 收集损失值
tf.summary.scalar("losses", loss)
merged = tf.summary.merge_all() #将所有的摘要信息保存到磁盘
init_op = tf.global_variables_initializer()
with tf.Session() as sess: # 通过Session运行op
sess.run(init_op)
# 打印初始权重、偏移值
print("weight:", weight.eval(), " bias:", bias.eval())
#### 指定事件文件
fw = tf.summary.FileWriter("../summary/", graph=sess.graph)
for i in range(500): # 循环执行训练
sess.run(train_op) # 执行训练
summary = sess.run(merged) #### 运行合并摘要op
fw.add_summary(summary, i) #### 写入文件
print(i, ":", i, "weight:", weight.eval(), " bias:", bias.eval())