Tensorflow介绍与环境搭建
Tensorflow是什么
Tensorflow: 是goolge开发的,最开始是google brain开发的内部库,后来开源出来
- 它是采用数据流图用于数值计算-可以理解为一个流程图,节点代表数学操作,线代表数据的走向,当数据从起点走到终点时我们就认为计算完成了
- 它功能强大,多平台支持,支持CPU,GPU,移动设备等
- 最开始用于深度学习,变得越来越通用,任何可以抽象成数据流图都可以用tensorflow
特性:
- 高度的灵活性,体现在数据流图上,只要可以表示为数据流图的就可以使用tensorflow
- 可移植性,在多平台执行
- 产品和科研结合,科研的结果可以直接用到产品上去
- 自动求微分
- 多语言支持
- 性能最优化
Tensorflow版本变迁
- 2015年11月:TensorFlow宣布开源并首次发布
- 12月:支持GPUs,Python 3.3(v 0.6)
- 2016年4月:分布式TensorFlow(v 0.8)
- 11月: 支持Windows(v 0.11)
- 2017年2月:性能改进,API稳定性(v 1.0) 此版本为分水岭
- 4月: Keras 集成(v 1.1)keras后端支持TensorFlow,并且TensorFlow中也有对Keras的集成版本
- 8月: 高级API,预算估算器,更多模型,初始TPU支持(v 1.3)
- 11月:Eager execution 和 TensorFlow Lite (v 1.5)
- 2018年3月:推出TF Hub,TensorFlow.js,TensorFlow Extended(TFX)
- 5月:新入门内容;Cloud TPU 模块与管道(v 1.6)所谓管道就是对数据一种高效的输入方式
- 6月: 新的分布式策略API;概率编程工具TensorFlow Probability(v 1.8)
- 8月:Cloud Big Table 集成(v 1.10)
- 10月:侧重于可用性的API改进(v 1.12)
- 2019年:TensorFlow v 2.0 发布
TensorFlow 1.0--主要特性
- XLA---Accelerate Linear Algebra 专门针对线性运算的编译器,这个编译器可以优化TensorFlow,使他计算的更快,
- TensorFlow训练速度提升58倍
- 可移植性,可以在移动设备运行
- 引入更高级别的API---tf.layers/tf.metrics/tf.losses/tf.keras
- TensorFlow调试器
TensorFlow 2.0--主要特性
- 使用tf.keras和eager mode 进行更加简单的模型构建
- 跨平台模型部署
- 因为对API进行优化,提供强大的研究实验
- 清楚不推荐使用的API和减少重复来简化API
TensorFlow2.0---简化的模型开发流程
- 使用tf.data加载数据
- 使用tf.keras构建模型,也可以使用premade estimator来验证模型
- 使用 TensorFlow hub 进行迁移学习
- 使用eager mode进行运行和调试
- 使用分发策略来进行分布式训练
- 导出到SavedModel
- 使用TensorFlow Serve,TensorFlow Lite,TensorFlow.js 部署模型
TensorFlow2.0---强大的跨平台能力
- TensorFlow服务
- 直接通过HTTP/REST或GRPC/协议缓冲区
- TensorFlow Lite---可部署在Android,IOS和嵌入式系统上
- TensorFlow.js---在javascript中部署模型
- 其他语言
TensorFLow2.0---强大的研究实验能力
- Keras功能API和子类API,允许创建复杂的拓扑结构
- 自定义训练逻辑,使用tf.GradientTape和tf.custom_gradient进行更细粒度的控制
- 低层API自始至终可以与高层结合使用,完全可定制
- 高级扩展:Ragged Tensors, Tensor2Tensor等
TensorFlow VS PyTorch
- 入门时间
- TensorFlow 1.*
- 静态图 :构建完之后不可更改
- 学习额外概念
- 图,会话,变量,占位符等
- 写样板代码
- TensorFlow 2.0
- 动态图:构建完之后可以更改
- Eager mode避免1.0缺点,直接集成在python中
- Pytorch
- 动态图
- Numpy的扩展,直接集成在python中
- 图的创建和调试
- 全面性
- 序列化与部署
- TensorFlow 1.*
图创建和调试
- TensorFlow 1.*
- 静态图,难以调试,学习tfdbg调试
- TensorFlow 2.0 与 pytorch
- 动态图,python 自带调试的工具
全面性
- Pytorch缺少
- 沿维翻转张量(np.flip, np.flipud, np.fliplr)
- 检查无穷与非数值张量(np.is_nan, np.is_inf)
- 快速傅里叶变换(np.fft)
- 随着时间变化 越来越少
序列化与部署
- Tensorflow 支持更加广泛
- 图保存为protocol buffer
- 跨语言
- 跨平台
- Pytorch支持比较简单
Tensorflow-keras 实战
tfkeras简介
keras是什么:
- 基于python的高级神经网络API
- Francois Chollet 于2014-2015年编写的
- 以Tensorflow,CNTK或者Teano为后端运行,keras必须有后端才可以运行
- 后端可以切换,现在多用tensorflow
Tensorflow-keras是什么:
- Tensorflow对keras API规范的实现
- 相对于以tensorflow为后端的keras,Tensorflow-keras与Tensorflow结合更加紧密
- 实现在tf.keras空间下
Tf-keras和keras联系:
- 基于同一套API
- keras程序可以通过改导入方式轻松转为tf.keras程序
- 反之可能不成立,因为tf.keras有其他特性
- 相同的JSON和HDF5模型序列化格式和语义
Tf-keras和keras区别:
- Tf.keras全面支持eager mode
- 只是用keras.Sequential和keras.Model时没有影响
- 自定义Model内部运算逻辑时候会有影响
- Tf底层API可以使用keras的model.fit等抽象
- 适用于研究人员
- Tf.keras支持基于tf.data的模型训练
- Tf.keras支持TPU训练
- Tf.keras支持tf.distribution中的分布式策略
- 其他特性
- Tf.keras可以与Tensorflow中的estimator集成
- Tf.keras可以保存为SavedModel
如何选择?
- 如果想用tf.kears的任何一个特性,那么选择tf.keras
- 如果后端互换性很重要,那么选keras
- 如果都不重要,那随便
分类问题和回归问题
- 分类问题预测的是类别,模型的输出是概率分布
- 三分类问题输出例子:[0.2,0.7,0.1]
- 回归问题预测的是值, 模型的输出是一个实数值
目标函数
为什么需要目标函数?
- 参数是逐步调整的
- 目标函数可以帮助权衡模型的好坏
分类问题:
- 需要权衡目标类别与当前预测的差距
- 三分类问题输出例子:[0.2,0.7,0.1]
- 三分类真实类别:2->one_hot->[0,0,1]
- One-hot编码,把正整数变为向量表达
- 生成一个长度不小于正整数的向量,只有正整数的位置处为1,其余位置都为0
- 平方差损失
- 交叉熵损失
- 平方差损失举例
- 预测值:[0.2,0.7,0.1]
- 真实值:[0,0,1]
- 损失函数值:[(0-0)2+(0.7-0)2+(0.1-1)^2]*0.5=0.65
回归问题:
- 预测值与真实值的差距
- 平方差损失
- 绝对值损失
归一化与批归一化
归一化:
- Min-max 归一化:
- Z-core 归一化: μ均值 δ方差
批量归一化:
- 每层的激活值都做归一化
左侧没有归一化,导致theta1和theta2的数据范围不一致,所以等高线看起来为椭圆,导致计算梯度时候法向量不指 向圆心,会走弯路
Dropout
Dropout作用:
- 防止过拟合
- 训练集很好,训练集上不好
- 参数太多,记住样本,不能泛化
wide & deep模型
- 16年发布,用于分类和回归
- 应用到了Google Play 中的应用推荐
稀疏特征
-
离散值特征
-
One-hot表示
-
Eg:专业={计算机,人文,其他},人文=[0,1,0]
-
Eg.:词表={人工智能,你,他,慕课网,...}. 他=[0,0,1,0...]
-
叉乘={(计算机, 人工智能),(计算机, 你),....}
-
叉乘之后
- 稀疏特征做叉乘获取共现信息
- 实现记忆的效果
稀疏特征-优缺点
- 优点
- 有效,广泛用于工业界
- 缺点
- 需要人工设计
- 可能过拟合,所有特征都叉乘,相当于记住每一个样本
密集特征
-
向量表达
- Eg:词表={人工智能,你,他,慕课网}
- 他:[0.3,0.2,0.6,(n维向量)]
-
Word2vec工具
- 男-女=国王-王后
密集特征优缺点
- 优点
- 带有语义信息,不同向量之间有相关性
- 兼容没有出现过的特征组合
- 更少人工参与
- 缺点
- 过度泛化,推荐不怎么相关的产品
超参数搜索
为什么要超参数搜索:
- 神经网络有很多训练过程中不变的参数
- 网络结构参数:几层,每层宽度,每层激活函数等
- 训练参数:batch_size,学习率,学习衰减算法等
- 手工去试耗费人力
搜索策略:
- 网格搜索
- 随机搜索
- 遗传算法搜索
- 启发式搜索
网格搜索:
随机搜索:
遗传算法搜索:
启发式搜索:
网友评论