Tensorflow学习之基础知识

tensorflow学习之基础知识。

tensorflow特点

1、真正的可移植性

引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,

如安卓设备、ios、树莓派等等

2、多语言支持

Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和

执行你的graphs,你可以直接写python/c++程序。

3、高度的灵活性与效率

TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库,能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高

4、支持
TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望

TensorFlow 成为机器学习研究人员和开发人员的通用语言

图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor,表示操作之间流动的数据单元的对象

获取调用:

1、tf.get_default_graph()

2、op、sess或者tensor 的graph属性

OP

image-20200904122531769

图的创建

tf.Graph()

使用新创建的图

1
2
3
4
g = tf.Graph() 
with g.as_default():
a = tf.constant(1.0)
assert c.graph is g

会话

tf.Session()

运行TensorFlow操作图的类,使用默认注册的图(可以指定运行图)

会话资源

会话可能拥有很多资源,如 tf.Variable,tf.QueueBase和tf.ReaderBase,会话结束后需要进行资源释放

1、sess = tf.Session() sess.run(…) sess.close()

2、使用上下文管理器

1
2
with tf.Session() as sess: 
sess.run(...)

3、config=tf.ConfigProto(log_device_placement=True)

  • 交互式:tf.InteractiveSession()

会话的run()方法

run(fetches, feed_dict=None,graph=None)

运行ops和计算tensor

  • 嵌套列表,元组,namedtuple,dict或OrderedDict(重载的运算符也能运行)

  • feed_dict 允许调用者覆盖图中指定张量的值,提供给

placeholder使用

  • 返回值异常
  • RuntimeError:如果它Session处于无效状态(例如已关闭)。
  • TypeError:如果fetches或feed_dict键是不合适的类型。
  • ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在。

Tensorflow Feed操作

意义:在程序执行的时候,不确定输入的是什么,提前“占个坑”

语法:placeholder提供占位符,run时候通过feed_dict指定参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# placeholder相当于一个占位符,feed_dict是一个字典
# plt=tf.placeholder(tf.float32,[2,3])
plt=tf.placeholder(tf.float32,[None,3])
print(plt)
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(plt,feed_dict={plt:[[1,2,3],[4,5,6]]}))
print('*'*20)
print(a.shape)
print('*'*20)
print(plt.shape)
print('*'*20)
print(a.name)
print('*'*20)
print(a.op)

张量

张量的阶和数据类型:
  • Tensorflow基本的数据格式

  • 一个类型化的N维度数组(tf.Tensor)

  • 三部分,名字,形状,数据类型

张量的阶:

image-20200906065836799

张量的数据类型:

image-20200906065859997

张量属性:
  • graph 张量所属的默认图

  • op 张量的操作名

  • name 张量的字符串描述

  • shape 张量形状

张量的动态形状与静态形状:

TensorFlow中,张量具有静态形状和动态形状

静态形状: 创建一个张量或者由操作推导出一个张量时,初始状态的形状

  • tf.Tensor.get_shape:获取静态形状

  • tf.Tensor.set_shape():更新Tensor对象的静态形状,通常用于在不能直接推断的情况下

动态形状:一种描述原始张量在执行过程中的一种形状

  • tf.reshape:创建一个具有不同动态形状的新张量

要点

1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形

2、 对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状

3、tf.reshape()动态创建新张量时,元素个数不能不匹配

张量操作-生成张量

image-20200906072446604

image-20200906072521578

image-20200906072552195

image-20200906072601916

提供给Tensor运算的数学函数
  • 算术运算符
  • 基本数学函数
  • 矩阵运算
  • 减少维度的运算(求均值)
  • 序列运算

变量

变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量

变量的创建

tf.Variable(initial_value=None,name=None)

  • 创建一个带值initial_value的新变量

  • assign(value):为变量分配一个新值,返回新值

  • eval(session=None:计算并返回此变量的值

  • name:属性表示变量名字

变量的初始化
  • tf.global_variables_initializer():添加一个初始化所有变量的op,在会话中开启

可视化学习Tensorboard

数据序列化-events文件

TensorBoard 通过读取 TensorFlow 的事件文件来运行

  • tf.summary.FileWriter(‘/tmp/tensorflow/summary/test/‘, graph=default_graph)

  • 返回filewriter,写入事件文件到指定目录(最好用绝对路径),以提供给tensorboard使用

开启

tensorboard –logdir=/tmp/tensorflow/summary/test/

一般浏览器打开为127.0.0.1:6006

注:修改程序后,再保存一遍会有新的事件文件,打开默认为最新

图中的符号意义

image-20200906073401602

增加变量显示

目的:观察模型的参数、损失值等变量值的变化

1、收集变量

  • tf.summary.scalar(name=’’,tensor) 收集对于损失函数和准确率等单值变量,name为变量的名字,tensor为值

  • tf.summary.histogram(name=‘’,tensor) 收集高维度的变量参数

  • tf.summary.image(name=‘’,tensor) 收集输入的图片张量能显示图片

2、合并变量写入事件文件

  • merged = tf.summary.merge_all()

  • 运行合并:summary = sess.run(merged),每次迭代都需运行

  • 添加:FileWriter.add_summary(summary,i),i表示第几次的值

案例(基于Notebook)

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf

# 创建一张图,上下文环境
g=tf.Graph()

print(g)

with g.as_default():
c=tf.constant(11.0)
print(c.graph)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 实现一个加法运算
a=tf.constant(5.0)
b=tf.constant(6.0)
sum1=tf.add(a,b)

tf.get_default_graph()

# 只能运行一个图结构
with tf.Session() as sess:
print(sess.run(sum1))

# 可以在会话中指定一张图
with tf.Session(graph=g) as sess:
print(sess.run(c))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import tensorflow as tf
import os

# 定义命令行参数
# 第一个参数:名字,第二个参数:默认值,第三个参数:说明
tf.app.flags.DEFINE_integer('max_step','200','模型训练的部数')
tf.app.flags.DEFINE_string('mode_dir','','模型加载路径')

# 定义获取命令行参数
FLAGS=tf.app.flags.FLAGS

with tf.variable_scope('data'):
tf.InteractiveSession()
# 准备数据 x 特征值[100,10] y 目标值[100]
x=tf.random_normal([100,1],mean=1.75,stddev=0.5,name='x_data')
# 矩阵相乘必须是二维的
y_ture=tf.matmul(x,[[0.7]])+0.8

with tf.variable_scope('model'):
# 建立线性回归模型 1个特征,1个权重,一个偏置
# 随机给权重和偏置的值,进行优化,注意用变量定义才能够优化
weight=tf.Variable(tf.random_normal([1,1],mean=
0.0,stddev=1.0),name='w')
bias=tf.Variable(0.0,name='b')
y_predict=tf.matmul(x,weight)+bias

with tf.variable_scope('loss'):
# 建立损失函数,均方根误差
loss=tf.reduce_mean(tf.square(y_ture-y_predict))

with tf.variable_scope('optimizer'):
# 梯度下降优化损失
train_op=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# 定义一个保存模型的实例
saver=tf.train.Saver()

# 收集tensor
tf.summary.scalar('losses',loss)
tf.summary.histogram('weights',weight)
# 合并变量tensor
merged=tf.summary.merge_all()

# 定义一个初始化的Op
init_op=tf.global_variables_initializer()

# 通过会话运行程序
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 打印随机初始化的权重和偏置
print('随机初始化的参数权重维:%f ,随机偏置为:%f' % (weight.eval(),bias.eval()))
# 建立事件文件
filewriter=tf.summary.FileWriter('Data/tem/',graph=sess.graph)
# 加载模型,覆盖模型中当中定义的参数,从上次训练的开始
if os.path.exists('Data/tem/ckpt/gd/checkpoint'):
saver.restore(sess,FLAGS.mode_dir)
# 运行优化op 循环训练
for i in range(FLAGS.max_step):
sess.run(train_op)
# 运行合并的tensor
summary=sess.run(merged)
# 写入
filewriter.add_summary(summary,i)
print('第%d次优化的参数权重为:%f ,偏置为:%f' % (i,weight.eval(),bias.eval()))
# 保存模型
saver.save(sess,'Data/tem/ckpt/gd')
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2020 WuXei Si
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信