说明
- 接触TF时已经是2.0的版本了,一上手就是Keras的框架。随着了解深入发现自己欠缺太多基本的知识。
- 目前学习方法, 看着官方的教程+别人博文(笔记)。
- 以时间顺序记录。
Week 1
Part 1 :执行模式
TF2.0默认的是即时执行模式,如果你输入:print("Eager execution: {}".format(tf.executing_eagerly()))
默认是为True。
如果在tf 1.x版本你想要打开:tf.compat.v1.enable_eager_execution()
这里就涉及到几个概念:Eager execution、Graph execution、@tf.function
具体看这个:图执行模式下的Tensorflow
尽管 TensorFlow 2 建议以即时执行模式(Eager Execution)作为主要执行模式,然而,图执行模式(Graph Execution)作为 TensorFlow 2 之前的主要执行模式,依旧对于我们理解 TensorFlow 具有重要意义。尤其是当我们需要使用 tf.function 时,对图执行模式的理解更是不可或缺。
简单来说,之前执行分为两部分。构建图+执行图。
构建图就是将定义的tensor作为节点保存,并没有实际的值。执行就是将固定好的图进行指定操作。
个人理解所谓tensorflow就是定义的tensor在构建的图上流动。
更为详细看这篇:对于tensorflow的理解【这篇写的实在太好了,必须转载保存】
-
对于Eager Execution,还可以看专知的系列:动态图机制 Eager Execution
-
对于@tf.function,初读官方教程那部分完全不知所云,有了对于TF机制的初步认识,结合下面两篇,下周阅读起来应该会比较顺畅。
阅读链接:tf.function和Autograph使用指南、TensorFlow 2.0 常用模块5:@tf.function
@tf.function 内在机制
当被 @tf.function 修饰的函数第一次被调用的时候,进行以下操作:
①在 Eager Execution 模式关闭的环境下,函数内的代码依次运行。也就是说,每个 tf. 方法都只是定义了计算节点,而并没有进行任何实质的计算。这与 TensorFlow 1.X 的 Graph Execution 是一致的;
②使用 AutoGraph 将函数中的 Python 控制流语句转换成 TensorFlow 计算图中的对应节点(比如说 while 和 for 语句转换为 tf.while , if 语句转换为 tf.cond 等等;
③基于上面的两步,建立函数内代码的计算图表示(为了保证图的计算顺序,图中还会自动加入一些 tf.control_dependencies 节点);
④运行一次这个计算图;
⑤基于函数的名字和输入的函数参数的类型生成一个哈希值,并将建立的计算图缓存到一个哈希表中。
⑥在被 @tf.function 修饰的函数之后再次被调用的时候,根据函数名和输入的函数参数的类型计算哈希值,检查哈希表中是否已经有了对应计算图的缓存。如果是,则直接使用已缓存的计算图,否则重新按上述步骤建立计算图。
Part 2:数据集
数据集的操作,在tf官方教程中专门有一部分针对pandas、numpy、csv等各种格式数据如何处理。
总结下自己实现demo接触到的:
·对于CSV文件,用tf.data.experimental.make_csv_dataset方法,得到原始数据集,可以自定Batch_size。
返回的是(features, label) 。对构建的 tf.data.Dataset ,其中 features 是一个字典: {'feature_name': value}
·接着,用tf.stack方法,将数据整合成(batch,num_features)的张量形式
【tf.stack是矩阵拼接的方法,用axis可以定义不同维度的拼接】
·用map方法,将定义的函数映射到整个数据集。
在给的demo中,会用iter+next查看数据。
·我们首先要知道什么是可迭代的对象(可以用for循环的对象)Iterable:
·一类:list,tuple,dict,set,str
·二类:generator,包含生成器和带yield的generatoe function
·而生成器不但可以作用于for,还可以被next()函数不断调用并返回下一个值,可以被next()函数不断返回下一个值的对象称为迭代器:Iterator
·生成器都是Iterator对象,但list,dict,str是Iterable,但不是Iterator,要把list,dict,str等Iterable转换为Iterator可以使用iter()函数