深度学习(Deep Learning)和TensorFlow的介绍
- 深度学习
- 深度学习是利用多层神经网络结构,从大数据中学习现实世界中各类事物能直接用于计算机计算的表示形式(如图像中的事物、音频中的声音等),被认为是智能机器可能的“大脑结构”
- Learning:让计算机自动调整函数参数以拟合想要的函数的过程
- Deep:多个函数进行嵌套,构成一个多层神经网络,利用非监督贪心逐层训练算法调整有效地自动调整函数参数
- 简单地说深度学习就是:使用多层神经网络来进行机器学习
- TensorFlow
- TensorFlow是用来进行深度学习开发的深度学习框架
- 是Google Brain的计划产物
- 应用于AlphaGo, Gmail, Google Maps等1000多个产品
- 与2015年11月开源, 2017年2月发布1.0版本
- 架构师 Jeff Dean
- TensorFlow的历史版本
- Tensorflow的特点
- 1、真正的可移植性
- 引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,如安卓设备、ios、树莓派等等
- 2、多语言支持
- Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs,你可以直接写python/c++程序。
- 3、高度的灵活性与效率
- TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不段在提高
- 4、支持
- TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望
- TensorFlow 成为机器学习研究人员和开发人员的通用语言
- TensorFlow的结构
- TensorFlow运算的定义和执行方式
- 需要通过调用TensorFlow的接口来定义操作OP和张量并自动汇总成一个流程图
- 需要通过session的会话对象来执行流程图中的操作
- TensorFlow的数据流图
- 数据流图可以理解为整个训练的逻辑图
- 通过以图的逻辑来进行不断的训练模型
- TensorFlow的组成理解
- Tensor + flow
- Tensor: 提供给训练流动的数据
- flow: 组成训练逻辑的流程图
- TensorFlow调用时候的异常处理
- 1、可以通过源码安装的方式避免警告
- 2、通过加入如下的代码解决
- import os
- os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
- TensorFlow文档
- https://www.tensorflow.org/versions/r1.0
TensorFlow--图
- 图的介绍
- 图可以表示为是由一组计算单位对象tf.Operation和其中间流动的数据单元tf.Tensor组成
- 其在定义好tf.Opetation和tf.Tensor后便默认生成
- 调用图对象的方法
- tf.get_default_graph() 调用当前默认图的方法
- op.graph 获取当前op所存在的图
- sess .graph 获取当前会话所存在的图
- tensor.graph 获取当前的数据单元所存在的图
- 图的创建\调用
- new_g = tf.Graph() 图的创建
- with new_g.as_default(): 使用新创建的图
- with tf.session(graph=new_g) as sess: 图的调用, 指定图创建会话
TensorFlow--op
- op的介绍
- op可以理解为神经元, 一个神经元有多个输入,一个或者多个输出
- op在接收到输入的tensor数据后, 通过一系列的操作, 返回输出内容
- 需要在sess会话中run调用才可以执被执行
- 可以类比为python的函数/方法
- 常用的op有哪些
TensorFlow--会话
- 会话的介绍
- 会话 session可以理解为图和处理器之间的桥梁,只有通过session才能够将图中定义的op\tensor等执行
- 创建会话的方法
- tf.Session() 需要手动close()
- with tf.Session() as sess: 不需要进行手动close()
- with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: 创建会话并指定运行会话的设备
- with tf.InteractiveSession() as sess: 创建交互方式的会话
- 会话拥有的资源
- tf.Variable
- tf.QueueBase
- tf.ReaderBase
- 会话资源在会话结束后会进行回收
- 会话的run方法
- run(fetches, feed_dict=None,graph=None) 可以运行op或者计算tensor
- fetches: 可以是op,tensor,列表, 元组,namedtuple,dict,OrderedDict
- feed_dict: 允许调用者覆盖图中指定的张量的值, 提供给placeholder使用
- 返回的异常值
- RuntimeError:如果它Session处于无效状态(例如已关闭)。
- TypeError:如果fetches或feed_dict键是不合适的类型。
- ValueError:如果fetches或feed_dict键无效或引用 Tensor不存在
TensorFlow--Tensor(张量)
- 张量的创建
- tf.constant() 直接创建确定值的张量
- tf.placeholder() 创建Feed类型的张量
- tf.Variable() 创建变量类型的张量
- 参数:
- shape: 张量的形状, 定义张量的阶
- dtype: 定义张量的数据类型
- name: 定义张量的名称
- Feed操作
- 作用
- 在程序执行的时候, 不确定性输入什么的是什么的时候, 提前占位(相当于python的缺省参数的作用)
- 使用方法
- tf.placholder(dtype, shape, name) 创建Feed类型占位张量
- 调用方法
- sess.run([op_name], feed_dict={placeholder_name: value})
- 图例
- 张量的阶
- 张量的数据类型
- 张量的属性
- graph: 张量所属的默认图
- op: 创建出张量的操作名
- name: 张量的字符串描述
- shape: 张量的形状
- 操作演示
- 张量的动态形状与静态形状
- 静态形状
- 创建一个张量,初始的形状为静态性状
- 动态形状
- 一种描述原始张量在执行过程中的一种形状(动态变化), 代表经过变化后的静态形状
- 形状的获取
- Tensor.get_shape() 获取张量形状
- Tensor.set_shape([]) 对非固定形状的张量进行形状设置, 即只能对Feed类型张量进行设置
- tf.reshape(Tensor, shape=[]) 可以对张量进行形状的转换, 但是元素数量必须相等
- 张量转化的要点
- 1、转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状
- 2、 对于已经固定或者设置静态形状的张量/变量,不能再次设置静态形状
- 3、tf.reshape()动态创建新张量时,元素个数不能不匹配
- 生成张量
- tf.zeros(shape, dtype=tf.float32, name=None) 创建所有元素为0的张量
- tf.ones(shape, dtype=tf.float32, name=None) 创建所有元素为一的张量
- tf.constant(value, dtype=Noe, shape=None, name=None) 创建一个常量张量
- tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 创建正态分布的随机张量
- 张量数据类型变换
- 张量形状的变换和切片
TensorFlow--变量
- 什么是变量
- 变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量,默认被训练
- 变量的创建及其初始化
- tf.Variable(initial_value=None,name=None, trainable=True) 创建一个带值initial_value的新变量
- tf.global_variables_initializer() 添加一个初始化所有变量的op, 需要在会话中开启
- sess.run() 运行op
- 变量的属性的方法
- assign(value) 为变量重新分配一个值
- name 变量的名字
- eval(session=None) 计算并返回变量的值、需要在会话中执行
TensorFlow--Tensorboard
- events文件
- events文件可以记录图的内容,和变量等信息
- TensorBoard 通过读取 TensorFlow 的事件文件来运行并进行可视化的
- 创建event文件
- file_writer = tf.summary.FileWriter('XXX', graph) 创建writer对象,并创建events文件,在会话中进行
- 写入事件(图)文件到指定目录(最好用绝对路径),以提供给tensorboard使用
- 在events文件中记录变量变化
- 收集变量的变化
- tf.summary.histogram(name="",tensor) 收集高维度的变量参数
- tf.summary.image(name="",tensor) 收集输入的图片张量
- tf.summary.scalar(name="",tensor) 收集对于损失函数和准确率
- 合并变量并写入事件文件
- merged = tf.summary.merge_all() 合并变量
- summary = sess.run(merged) 运行合并,每次添加前都需要运行,会话中进行
- FileWriter.add_summary(summary,i) 添加变量, i表示第几次添加,会话中进行
- 开启tensorboard功能
- tensorboard --logdir=“XXX”
- tensorboard中符号的意义
TensorFlow--变量作用域
- 变量作用域
- 让模型代码更加清晰,作用分明
- 可以将作用域分开, 变量会按照作用域进行域的划分,在tensorboard中观察变量也更清晰
- 创建作用域的方法
- with tf.variable_scope(<scope_name>): 用上下文管理器的方式创建作用域
- scope_name: 为变量作用域的名称
TensorFlow--命令行参数
- 作用
- 我们可以通过使用tf.app.flags提供的方法, 来定义参数, 同样我们也可以通过它提供的方法来调用定义的参数
- 命令行参数定义的方式
- 命令行参数的调用方式
- tf.app.flags.,在flags有一个FLAGS标志,它在程序中可以调用到我们前面具体定义的flag_name
- tf.app.flags.FLAGS.xxx
- 调用main函数方法
- 通过tf.app.run()可直接启动main(argv)函数
- 代码示例:
TensorFlow--模型的保存和加载
- 保存模型的方法
- 创建模型保存操作Op
- saver_op = tf.train.Saver(var_list=None,max_to_keep=5)
- var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递. 默认保存图中全部变量
- max_to_keep: 指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件。)
- 对模型进行保存(在会话中操作)
- saver_op.save(sess, save_path)
- sess: 会话对象, 默认当前会话
- save_path: 保存路径, 保存文件格式为checkpoint文件
- 模型的加载(恢复)方法
- saver_op.restore(sess, save_path) 模型恢复, 在会话中操作
- sess: 会话对象
- save_path: 存储路径
Tensorflow--简单的运算API
- 矩阵运算
- tf.matmul(x, w)
- 平方
- tf.square(error)
- 均值
- tf.reduce_mean(error)
Tensorflow--梯度下降训练api
- 使用方法
- train_op = tf.train.GradientDescentOptimizer(learning_rate).method(minloss) 创建训练Op
- learning_rate: 学习率
- minloss: minisize 学习方式, minisize为最小损失
- sess.run(train_op) 调用训练OP