文章目录
1 学习tensorflow2.0之前需要的基础知识前言
tf2.0已经把难度下降了非常多,但是在学习之前还是需要有一些基本的知识的,这些基本知识是大多数框架都难以避免的。这里我列举一下,并给出具体的要求。
学习tf2.0需要基础知识
python基础
装饰器
要求看到装饰器不要害怕,虽然我们不会用装饰器写代码,但是看到tf里面用到的装饰器能大致理解它在干嘛。别只会用,却不懂它在干什么。
迭代器
在某些场景下需要灵活的定制化数据输入管道,因为内存一次性是放不下这么多的数据的,因此迭代器需要好好掌握。
tf.data里面就用了很多迭代器去封装数据。
目标:能够在特定条件下自己定制数据输入管道,不用借助tf.data。这一点在cutting ege 论文复现中很重要。
上下文管理器
简单了解,知道就行。
面向对象编程思想
重点在鸭子类型,例如call等。
python的模块导入机制
pip使用和virtualenv
numpy编程
多维切片索引
这是numpy基本要求,掌握从numy中随意的取出数据。
view&©
这个我现在还不了解。。。
清楚理解numpy ndarray的轴
理解ndarray轴之后,tensor的轴也就明白了。需要注意图像和矩阵在ndarray中的区别。transpose换轴要熟练。
ndarray在内存上的结构有基本的认识
简单理解,如果能够深入理解的话可以解决很隐蔽但是不常遇到的bug。
linux操作系统
SSH
SSH和notebook对比:notebook讲解展示效果更好,但是如果你需要训练、搭建环境或者写脚本的话notebook就做不了了,或者即使有的能实现也很困难。所以notebook适合你什么都做好了,直接写python代码和夹带一些简单的linux命令情况。
Linux系统的文件系统
linux一切都是文件,包括硬件也是文件。
linux系统的账户管理
root是一把双刃剑。
linux系统的驱动安装
git和github
机器学习
知道统计机器学习为什么叫 统计么?
统计机器学习处理的结构化数据的基本概念
机器学习的几个分类维度
能独立判断一个模型过拟合还是欠拟合
了解统计学习项目的基本流程
深度学习
明白深度学习擅长的领域
了解常见的深度神经网络层
总结
文章目录
2 tensorflow2.0概述前言
通过这一节,了解tensorflow可以做什么,遇到一个问题能够判断tensorflow有什么现成的库,最后需要明白自己要学什么,不要一窝蜂地都学,那样没啥效果。我们要知道哪些内容需要理解并熟练掌握,哪些内容可以选择记忆,用到的时候再看这部分内容。
tensorflow summary
简介
tensorflow是一个非常全的,开源的,针对机器学习(不止是深度学习),**平台(具体怎么发挥取决你)**的软件包。
全景图
上图是tf的全景,左边train部分包括distribution统一调度底层的硬件,tf.keras和estimators这两个高级api去搭建模型,这里还可以通过底层custm层自定义层(学术型的工作)。tensorflowhub里面有很多先进的算法实现,可以拿到本地去使用。read&preprocess data 是花费时间最多的地方,很多时候模型搭建写不了多少时间,大都在data处理上,因此这部分要掌握好。
右边是开发部分,serving是把训练好的model设置成后端api, lite部署到嵌入式,针对前向传播进行大量的编译优化,.js是面对前端网页的。此外还有其他语言的转换。
tf2.0 和1.0相比,它把高层api统一合并到keras,并删除了大量的冗余的api,降低学习难度。
training 阶段
这是训练的流程,其中tf.data和feature colums用好的话可以大大降低在数据处理上花费时间,因此是整个训练部分最应该要熟练掌握的。 tensorboard可以对训练整个过程进行调控和监视。keras和estimators简单知道几个常用的就行,其他的用到时候可以查google,但是custom自定义层要熟练掌握。
develpment部分
把模型部署出来,略。
tensorflow扩展工具
tensorboard:模型可视化工具,经常会用到
XLA:加速库
probability:自己加入先验知识,强加到模型中,也就是掌舵tf变化。
ragged tensor: 让tensor 变成可变长的tensor,常用在rnn中。
tensor2tenor: 加速dl的研究,将先进的模型放入进去。
privacy: 加密。
federated: 解决数据分散和数据不能共享问题,但是所有人基于共同的数据能够训练出来一个好的模型。有点像区块链。
rl :强化学习,但是不完善。
其他:也有很多其他的生态扩展包,用到时候可以查。
tensorboard(模型训练驾驶舱)
XLA
工业中对模型的大小和运行进行优化,学术领域用不到。
机器学习的工作全景
从下图可以看出,机器学习真正code只有中间很少的一部分,如果只钻到ML code很容易陷入一个技术瓶颈。大多数的时间会在data收集、验证、提取特征上。很多研究人员在ml code领域,虽然他们工作很少,但是整个流程都是围绕他运行的。因此要对ML code有正面评价,但是还要有负面评价。如果在大公司一个人只做其中的一个小方向,好处是能够做到精尖的水平,但是小公司就要全做了,这样能锻炼水平但是我觉得增值慢。没有精尖增值快。
3 TF2.0 初步使用前言
介绍tensorflow的安装和基本使用。
正文
tf2.0的安装
- 安装之前请查看如何将pip下载地址更换成国内的镜像,国内的镜像和国外完全一样,只是慢五分钟。anaconda参照:添加链接描述,如果觉得上面链接源不稳定可以更换成我设置的源,非常好用。
ssl_verify: true
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
- conda-forge
show_channel_urls: true
- 安装最新tensorflowde 的GPU版本。
pip install tensorflow-gpu
如果没有GPU的话那么安装cpu版本,学习的话够了。
pip install tensorflow
- 安装notebook作为编辑器,在命令行运行:(ps:在开发领域用vscode,但是数据科学中notebook一定是第一选择,可以直观的看数据的变化)
pip install jupyter
- 启动notebook:
jupyter notebook
- 新建ipynb并输入下面的测试代码:
import tensorflow as tf
print(tf.__version__)
print(tf.reduce_sum(tf.random.normal([1000,1000])))
得到如下结果:
认识Tensor
什么是tensor
tensor本质是一个计算流程,而不是一个张量,他们不是一个维度层次的比较。因此在eager execution之前tensorflow难用的一个点就是在在设计完计算流程之后才能执行sesion.run去执行结果,这导致可视性差和操作麻烦,因此2.0设计了实时的计算。
tensor 、numpy ndarry、tensor.Variable
tensor本质是计算流程会导致tensorflow只接受tensor的变量,不在入口和出口以外的地方接受非tensor的变量输入,即使numpy也不行,tensor在numpy基础上进行了api封装,让它可以放在嵌入式设备,gpu等中,从下图中可以看出:
tensor 可以放入gpu和tpu上,但是ndarry只能在内存中,这样我们就知道为什么gpu比cpu快了。
四种变量的辨析:
第一个是普通变量, t1是ndarry,t2是tensor,对ndarray封装,可以理解为不能更改的一个tensor流程点,因为这个流程已经计算完了。t4是在tensor基础上又封装了一次,可以在最后决定流程之前进行变化。注意:<>代表可以用于tf运算的内容,没有的话tf不认)
**总结:**这部分要明白下面variable是方便用户去自行输入变量或者模型的,可以更改,而tensor是框架要用的,比如有些不能更改的内容要用tensor,类似于人的骨架。
tensor基本操作
学会numpy就相当于了tensor的低级api。
矩阵乘法和向量乘法
matmul是举证乘法,而*是向量乘法。
类型转换
文中【4】表达了list 转换成tensor,1也转换成tensor,然后掉用tf.add把他们相加,注意这里用到了广播机制。
【5】用+ 作为add 的运算符重载。
总结就是只要有tensor类型就可以和其他的类型运算,但是如果一个tensor都没有的话就不行了。
方差
均值
axis=0 是按照纵向来算,keepdims是保留原来矩阵的大小。
随机数生成
这一知识点一般用在layer初始的随机数分配,一般就用到正态和均匀分布。
找极值
需要注意返回的是索引。
最后可以用tf.reshape(a,[3,3])将数据改成3*3的矩阵。注意只能用tf的方法来对tensor操作,想要转换成numpy的话变量后面加.numpy。
总结:
keras和深度学习简介
tf.keras vs keras
tf.keras在tensorflow中已经安装。不建议用keras,因为tf.keras比keras更适配tensorflow。如果团队中有人用mxnet,有人用pytorch,那么可以统一用keras,然后用k.backend去统一管理框架代码。但是一般一个团队都是一个框架,而且高级api独立的框架间接调用会更慢一些。
深度学习理解
深度学习的理解如下,这里面噪声是基于目标的噪声,layer是去除原始数据上没有表达一个类别特性的噪声,保留高纬度能够反映数据区别的特征。
深度学习本质如下,模型是层的集成,层是张量data的集成。
神经网络的基本要素
输入数据:数据才是决定任务上限,模型算法就是让识别率接近上限。举个例子:学术界定好数据集然后研究这个数据集上算法能够达到什么上限。工业界主要工作是收集数据,直接用数据去逼近上限。例如100w的数据可能需要一些算法工程师研究很多时间才能达到和1亿数据随便训练一下的效果。从这里可以看出整个算法在行业中做了很小的一部分,这也是为啥算法工程师越来越少的原因,因为算法企业可以直接用最先进的啊,但是数据和系统都需要按照公司的标准去开发,时间和人手都需要很多。现在想想如果做研究应该做到什么水平,有什么定位?比如我之前的婴幼儿哭声分析可以说数据就很差,我提出了算法没有好的baseline和数学分析。总结:学术圈考虑算法,工业领域要考虑决定应用的上限–数据。
loss:反馈训练的信号。
optimizer:如何根据反馈信号去调整模型。
层:
将输入数据从一变成多个,或者从多个变成一个。有状态是指能变化的层,例如全连接,而input层就是无状态的,因为不管谁来都一样不变化。
模型:
深度学习是有向无环图,而不是类似堆栈的结构,这一点要理解。
loss函数!!!!
loss很关键,loss决定你对问题的理解。自定义的loss不要偏离你的目标。在学术领域要经常更改loss去获得一个更好的信号,建议可以自定义一个loss包,每次做实验都拿来用用。
optimizer
略。
keras工作流程
数据处理不仅仅负责将数据传入,还负责数据增强。
需要学习的keras模块
总结
MNIST in tf.keras
任务介绍
对官方内置的数据集(6w张0-9的灰度图)像进行分类。
数据集导入
这一步本来是很麻烦的,但是我们在初步练习时候要尽量避免这一部分工作,直接用tf内置的数据集。让我们将精力放在模型架构设计中。初学过程中把tf.keras.dataset都跑一遍,差不多keras已经学习的差不多了。
数据预处理
注意第八行将数据要转换成tensor格式。
模型建立
当我们在复现别人论文时候,按照作者论文中的网络架构图和参数进行设置,然后比对一下自己设计总参数和作者给的总参数是否一样,如果一样的话那么论文代码就基本复现了,但是激活函数就得自己去比对了。sequential可以设计堆栈,function可以设计有向无环图。如果发现参数数量不对,那么要对单层的param检查,通过计算论文每个层本应该有的param来纠正自己的复现网络架构。
编译和训练
loss表示模型在数据上的效果,optimizer是教练。metrics是自己想通过loss关注的东西。例如f1分数,高手在这里会定义很多东西反应模型训练的信息。batch需要符合计算机二进制,让卡充分利用。批处理的大小不仅仅是根据理论来决定的。他还由你本地的计算资源来决定,因此需要在几个理论值上不断地尝试。一般如果,批处理的大小设置过大的话可能会陷入局部最小,设置太小的话随机性太大,难以稳步的走向最优解。epoch太大容易过拟合,当我们发现训练集精度一致增加,测试的时候却逐步降低。这是过拟合了,需要在这种趋势之前将模型导出。
测试
这里测试集有时候会很差,有时候还会出现测试集很好,predict却很差。这都需要自己解决bug.