diff --git "a/1-3,\346\226\207\346\234\254\346\225\260\346\215\256\345\273\272\346\250\241\346\265\201\347\250\213\350\214\203\344\276\213.md" "b/1-3,\346\226\207\346\234\254\346\225\260\346\215\256\345\273\272\346\250\241\346\265\201\347\250\213\350\214\203\344\276\213.md" index 0b167980..cfff77e3 100644 --- "a/1-3,\346\226\207\346\234\254\346\225\260\346\215\256\345\273\272\346\250\241\346\265\201\347\250\213\350\214\203\344\276\213.md" +++ "b/1-3,\346\226\207\346\234\254\346\225\260\346\215\256\345\273\272\346\250\241\346\265\201\347\250\213\350\214\203\344\276\213.md" @@ -12,8 +12,6 @@ imdb数据集的目标是根据电影评论的文本内容预测评论的情感 - - 在tensorflow中完成文本数据预处理的常用方案有两种,第一种是利用tf.keras.preprocessing中的Tokenizer词典构建工具和tf.keras.utils.Sequence构建文本数据生成器管道。 第二种是使用tf.data.Dataset搭配.keras.layers.experimental.preprocessing.TextVectorization预处理层。 diff --git "a/3-1,\344\275\216\351\230\266API\347\244\272\350\214\203.md" "b/3-1,\344\275\216\351\230\266API\347\244\272\350\214\203.md" index 8328dd24..9eb08e1b 100644 --- "a/3-1,\344\275\216\351\230\266API\347\244\272\350\214\203.md" +++ "b/3-1,\344\275\216\351\230\266API\347\244\272\350\214\203.md" @@ -1,7 +1,5 @@ # 3-1,低阶API示范 - - 下面的范例使用TensorFlow的低阶API实现线性回归模型。 低阶API主要包括张量操作,计算图和自动微分。 diff --git "a/3-2,\344\270\255\351\230\266API\347\244\272\350\214\203.md" "b/3-2,\344\270\255\351\230\266API\347\244\272\350\214\203.md" index 86c01f06..18a9b4d3 100644 --- "a/3-2,\344\270\255\351\230\266API\347\244\272\350\214\203.md" +++ "b/3-2,\344\270\255\351\230\266API\347\244\272\350\214\203.md" @@ -1,7 +1,5 @@ # 3-2,中阶API示范 - - 下面的范例使用TensorFlow的中阶API实现线性回归模型。 TensorFlow的中阶API主要包括各种模型层,损失函数,优化器,数据管道,特征列等等。 diff --git "a/3-3,\351\253\230\351\230\266API\347\244\272\350\214\203.md" "b/3-3,\351\253\230\351\230\266API\347\244\272\350\214\203.md" index 1986ee84..220bf618 100644 --- "a/3-3,\351\253\230\351\230\266API\347\244\272\350\214\203.md" +++ "b/3-3,\351\253\230\351\230\266API\347\244\272\350\214\203.md" @@ -1,7 +1,5 @@ # 3-3,高阶API示范 - - 下面的范例使用TensorFlow的高阶API实现线性回归模型。 TensorFlow的高阶API主要为tf.keras.models提供的模型的类接口。 diff --git "a/4-1,\345\274\240\351\207\217\347\232\204\347\273\223\346\236\204\346\223\215\344\275\234.md" "b/4-1,\345\274\240\351\207\217\347\232\204\347\273\223\346\236\204\346\223\215\344\275\234.md" index 9d0b1f52..ddedfc7a 100644 --- "a/4-1,\345\274\240\351\207\217\347\232\204\347\273\223\346\236\204\346\223\215\344\275\234.md" +++ "b/4-1,\345\274\240\351\207\217\347\232\204\347\273\223\346\236\204\346\223\215\344\275\234.md" @@ -1,7 +1,5 @@ # 4-1,张量的结构操作 - - 张量的操作主要包括张量的结构操作和张量的数学运算。 张量结构操作诸如:张量创建,索引切片,维度变换,合并分割。 @@ -57,7 +55,7 @@ tf.print(d) [[0 0 0] [0 0 0] [0 0 0]] - ``` +``` ```python a = tf.ones([3,3]) @@ -140,7 +138,7 @@ tf.print(t) [[1 0 0] [0 2 0] [0 0 3]] - ``` +``` ```python diff --git "a/4-2,\345\274\240\351\207\217\347\232\204\346\225\260\345\255\246\350\277\220\347\256\227.md" "b/4-2,\345\274\240\351\207\217\347\232\204\346\225\260\345\255\246\350\277\220\347\256\227.md" index 41f0df9a..82749a1d 100644 --- "a/4-2,\345\274\240\351\207\217\347\232\204\346\225\260\345\255\246\350\277\220\347\256\227.md" +++ "b/4-2,\345\274\240\351\207\217\347\232\204\346\225\260\345\255\246\350\277\220\347\256\227.md" @@ -1,7 +1,5 @@ # 4-2,张量的数学运算 - - 张量的操作主要包括张量的结构操作和张量的数学运算。 张量结构操作诸如:张量创建,索引切片,维度变换,合并分割。 diff --git "a/4-3,AutoGraph\347\232\204\344\275\277\347\224\250\350\247\204\350\214\203.md" "b/4-3,AutoGraph\347\232\204\344\275\277\347\224\250\350\247\204\350\214\203.md" index 08783ff1..d8f36283 100644 --- "a/4-3,AutoGraph\347\232\204\344\275\277\347\224\250\350\247\204\350\214\203.md" +++ "b/4-3,AutoGraph\347\232\204\344\275\277\347\224\250\350\247\204\350\214\203.md" @@ -1,7 +1,5 @@ # 4-3,AutoGraph的使用规范 - - 有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph。 TensorFlow 2.0主要使用的是动态计算图和Autograph。 diff --git "a/4-4,AutoGraph\347\232\204\346\234\272\345\210\266\345\216\237\347\220\206.md" "b/4-4,AutoGraph\347\232\204\346\234\272\345\210\266\345\216\237\347\220\206.md" index 9d2bd9d8..70cc891e 100644 --- "a/4-4,AutoGraph\347\232\204\346\234\272\345\210\266\345\216\237\347\220\206.md" +++ "b/4-4,AutoGraph\347\232\204\346\234\272\345\210\266\345\216\237\347\220\206.md" @@ -1,7 +1,5 @@ # 4-4,AutoGraph的机制原理 - - 有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph。 TensorFlow 2.0主要使用的是动态计算图和Autograph。 diff --git "a/5-1,\346\225\260\346\215\256\347\256\241\351\201\223Dataset.md" "b/5-1,\346\225\260\346\215\256\347\256\241\351\201\223Dataset.md" index cf7c3ebc..0d0a1cc2 100644 --- "a/5-1,\346\225\260\346\215\256\347\256\241\351\201\223Dataset.md" +++ "b/5-1,\346\225\260\346\215\256\347\256\241\351\201\223Dataset.md" @@ -1,7 +1,5 @@ # 5-1,数据管道Dataset - - 如果需要训练的数据大小不大,例如不到1G,那么可以直接全部读入内存中进行训练,这样一般效率最高。 但如果需要训练的数据很大,例如超过10G,无法一次载入内存,那么通常需要在训练的过程中分批逐渐读入。 diff --git "a/5-2,\347\211\271\345\276\201\345\210\227feature_column.md" "b/5-2,\347\211\271\345\276\201\345\210\227feature_column.md" index a71e2c68..3c0b0fc3 100644 --- "a/5-2,\347\211\271\345\276\201\345\210\227feature_column.md" +++ "b/5-2,\347\211\271\345\276\201\345\210\227feature_column.md" @@ -1,7 +1,5 @@ # 5-2,特征列feature_column - - 特征列 通常用于对结构化数据实施特征工程时候使用,图像或者文本数据一般不会用到特征列。 diff --git "a/5-3,\346\277\200\346\264\273\345\207\275\346\225\260activation.md" "b/5-3,\346\277\200\346\264\273\345\207\275\346\225\260activation.md" index 7eb953e5..87000bbd 100644 --- "a/5-3,\346\277\200\346\264\273\345\207\275\346\225\260activation.md" +++ "b/5-3,\346\277\200\346\264\273\345\207\275\346\225\260activation.md" @@ -1,7 +1,5 @@ # 5-3,激活函数activation - - 激活函数在深度学习中扮演着非常重要的角色,它给网络赋予了非线性,从而使得神经网络能够拟合任意复杂的函数。 如果没有激活函数,无论多复杂的网络,都等价于单一的线性变换,无法对非线性函数进行拟合。 diff --git "a/5-4,\346\250\241\345\236\213\345\261\202layers.md" "b/5-4,\346\250\241\345\236\213\345\261\202layers.md" index 233d62cd..4a38ae7c 100644 --- "a/5-4,\346\250\241\345\236\213\345\261\202layers.md" +++ "b/5-4,\346\250\241\345\236\213\345\261\202layers.md" @@ -1,7 +1,5 @@ # 5-4,模型层layers - - 深度学习模型一般由各种模型层组合而成。 tf.keras.layers内置了非常丰富的各种功能的模型层。例如, diff --git "a/5-5,\346\215\237\345\244\261\345\207\275\346\225\260losses.md" "b/5-5,\346\215\237\345\244\261\345\207\275\346\225\260losses.md" index 139c7262..16a24c2b 100644 --- "a/5-5,\346\215\237\345\244\261\345\207\275\346\225\260losses.md" +++ "b/5-5,\346\215\237\345\244\261\345\207\275\346\225\260losses.md" @@ -1,7 +1,5 @@ # 5-5,损失函数losses - - 一般来说,监督学习的目标函数由损失函数和正则化项组成。(Objective = Loss + Regularization) 对于keras模型,目标函数中的正则化项一般在各层中指定,例如使用Dense的 kernel_regularizer 和 bias_regularizer等参数指定权重使用l1或者l2正则化项,此外还可以用kernel_constraint 和 bias_constraint等参数约束权重的取值范围,这也是一种正则化手段。 diff --git "a/5-6,\350\257\204\344\274\260\346\214\207\346\240\207metrics.md" "b/5-6,\350\257\204\344\274\260\346\214\207\346\240\207metrics.md" index 99c8129d..069a3153 100644 --- "a/5-6,\350\257\204\344\274\260\346\214\207\346\240\207metrics.md" +++ "b/5-6,\350\257\204\344\274\260\346\214\207\346\240\207metrics.md" @@ -1,7 +1,5 @@ # 5-6,评估指标metrics - - 损失函数除了作为模型训练时候的优化目标,也能够作为模型好坏的一种评价指标。但通常人们还会从其它角度评估模型的好坏。 这就是评估指标。通常损失函数都可以作为评估指标,如MAE,MSE,CategoricalCrossentropy等也是常用的评估指标。 diff --git "a/5-7,\344\274\230\345\214\226\345\231\250optimizers.md" "b/5-7,\344\274\230\345\214\226\345\231\250optimizers.md" index c6a9e99c..c632f5f6 100644 --- "a/5-7,\344\274\230\345\214\226\345\231\250optimizers.md" +++ "b/5-7,\344\274\230\345\214\226\345\231\250optimizers.md" @@ -1,7 +1,5 @@ # 5-7,优化器optimizers - - 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了。 diff --git "a/5-8,\345\233\236\350\260\203\345\207\275\346\225\260callbacks.md" "b/5-8,\345\233\236\350\260\203\345\207\275\346\225\260callbacks.md" index d706c3b8..686db06e 100644 --- "a/5-8,\345\233\236\350\260\203\345\207\275\346\225\260callbacks.md" +++ "b/5-8,\345\233\236\350\260\203\345\207\275\346\225\260callbacks.md" @@ -1,7 +1,5 @@ # 5-8,回调函数callbacks - - tf.keras的回调函数实际上是一个类,一般是在model.fit时作为参数指定,用于控制在训练过程开始或者在训练过程结束,在每个epoch训练开始或者训练结束,在每个batch训练开始或者训练结束时执行一些操作,例如收集一些日志信息,改变学习率等超参数,提前终止训练过程等等。 同样地,针对model.evaluate或者model.predict也可以指定callbacks参数,用于控制在评估或预测开始或者结束时,在每个batch开始或者结束时执行一些操作,但这种用法相对少见。 diff --git "a/6-1,\346\236\204\345\273\272\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" "b/6-1,\346\236\204\345\273\272\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" index c7555fb3..1441d55c 100644 --- "a/6-1,\346\236\204\345\273\272\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" +++ "b/6-1,\346\236\204\345\273\272\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" @@ -1,7 +1,5 @@ # 6-1,构建模型的3种方法 - - 可以使用以下3种方式构建模型:使用Sequential按层顺序构建模型,使用函数式API构建任意结构模型,继承Model基类构建自定义模型。 对于顺序结构的模型,优先使用Sequential方法构建。 diff --git "a/6-2,\350\256\255\347\273\203\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" "b/6-2,\350\256\255\347\273\203\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" index be4bbfe8..18913be9 100644 --- "a/6-2,\350\256\255\347\273\203\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" +++ "b/6-2,\350\256\255\347\273\203\346\250\241\345\236\213\347\232\2043\347\247\215\346\226\271\346\263\225.md" @@ -1,7 +1,5 @@ # 6-2,训练模型的3种方法 - - 模型的训练主要有内置fit方法、内置tran_on_batch方法、自定义训练循环。 注:fit_generator方法在tf.keras中不推荐使用,其功能已经被fit包含。 diff --git "a/6-3,\344\275\277\347\224\250\345\215\225GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" "b/6-3,\344\275\277\347\224\250\345\215\225GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" index 2cb7254c..b9f0e0a5 100644 --- "a/6-3,\344\275\277\347\224\250\345\215\225GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" +++ "b/6-3,\344\275\277\347\224\250\345\215\225GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" @@ -1,7 +1,5 @@ # 6-3,使用单GPU训练模型 - - 深度学习的训练过程常常非常耗时,一个模型训练几个小时是家常便饭,训练几天也是常有的事情,有时候甚至要训练几十天。 训练过程的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参数迭代。 diff --git "a/6-4,\344\275\277\347\224\250\345\244\232GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" "b/6-4,\344\275\277\347\224\250\345\244\232GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" index 8d1e2bbe..40f770e5 100644 --- "a/6-4,\344\275\277\347\224\250\345\244\232GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" +++ "b/6-4,\344\275\277\347\224\250\345\244\232GPU\350\256\255\347\273\203\346\250\241\345\236\213.md" @@ -1,7 +1,5 @@ # 6-4,使用多GPU训练模型 - - 如果使用多GPU训练模型,推荐使用内置fit方法,较为方便,仅需添加2行代码。 在Colab笔记本中:修改->笔记本设置->硬件加速器 中选择 GPU diff --git "a/6-5,\344\275\277\347\224\250TPU\350\256\255\347\273\203\346\250\241\345\236\213.md" "b/6-5,\344\275\277\347\224\250TPU\350\256\255\347\273\203\346\250\241\345\236\213.md" index b10cb63d..2e192051 100644 --- "a/6-5,\344\275\277\347\224\250TPU\350\256\255\347\273\203\346\250\241\345\236\213.md" +++ "b/6-5,\344\275\277\347\224\250TPU\350\256\255\347\273\203\346\250\241\345\236\213.md" @@ -1,7 +1,5 @@ # 6-5,使用TPU训练模型 - - 如果想尝试使用Google Colab上的TPU来训练模型,也是非常方便,仅需添加6行代码。 在Colab笔记本中:修改->笔记本设置->硬件加速器 中选择 TPU diff --git "a/6-6,\344\275\277\347\224\250tensorflow-serving\351\203\250\347\275\262\346\250\241\345\236\213.md" "b/6-6,\344\275\277\347\224\250tensorflow-serving\351\203\250\347\275\262\346\250\241\345\236\213.md" index b9cf4249..ff5139ca 100644 --- "a/6-6,\344\275\277\347\224\250tensorflow-serving\351\203\250\347\275\262\346\250\241\345\236\213.md" +++ "b/6-6,\344\275\277\347\224\250tensorflow-serving\351\203\250\347\275\262\346\250\241\345\236\213.md" @@ -1,7 +1,5 @@ # 6-6,使用tensorflow-serving部署模型 - - TensorFlow训练好的模型以tensorflow原生方式保存成protobuf文件后可以用许多方式部署运行。 例如:通过 tensorflow-js 可以用javascrip脚本加载模型并在浏览器中运行模型。 diff --git "a/6-7,\344\275\277\347\224\250spark-scala\350\260\203\347\224\250tensorflow\346\250\241\345\236\213.md" "b/6-7,\344\275\277\347\224\250spark-scala\350\260\203\347\224\250tensorflow\346\250\241\345\236\213.md" index b7fd80f1..432fe2d6 100644 --- "a/6-7,\344\275\277\347\224\250spark-scala\350\260\203\347\224\250tensorflow\346\250\241\345\236\213.md" +++ "b/6-7,\344\275\277\347\224\250spark-scala\350\260\203\347\224\250tensorflow\346\250\241\345\236\213.md" @@ -1,7 +1,5 @@ # 6-7,使用spark-scala调用tensorflow2.0训练好的模型 - - 本篇文章介绍在spark中调用训练好的tensorflow模型进行预测的方法。 本文内容的学习需要一定的spark和scala基础。 @@ -130,7 +128,7 @@ linear.save(export_path+version, save_format="tf") 也可以从下面网址中直接下载 org.tensorflow.tensorflow的jar包 以及其依赖的org.tensorflow.libtensorflow 和 org.tensorflowlibtensorflow_jni的jar包 放到项目中。 - + https://mvnrepository.com/artifact/org.tensorflow/tensorflow/1.15.0 diff --git a/README.md b/README.md index 77880fef..73ad9af3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # 《30天吃掉那只 TensorFlow2.0 》开篇辞 🔥🔥 - + +github项目地址:https://github.com/lyhue1991/eat_tensorflow2_in_30_days/ + +gitbook电子书地址: https://lyhue1991.github.io/eat_tensorflow2_in_30_days/ + + ### 一,TensorFlow2 🍎 还是 Pytorch🔥 先说结论: @@ -9,7 +14,7 @@ **如果是学生或者研究人员,应该优先选择Pytorch.** -**如果时间足够,最好Tensorflow2和Pytorch都要学习掌握。** +**如果时间足够,最好TensorFlow2和Pytorch都要学习掌握。** 理由如下: @@ -22,8 +27,6 @@ * 3,TensorFlow2和Pytorch实际上整体风格已经非常相似了,学会了其中一个,学习另外一个将比较容易。两种框架都掌握的话,能够参考的开源模型案例更多,并且可以方便地在两种框架之间切换。 - - ```python ``` @@ -45,13 +48,6 @@ tf.keras绝大部分功能和兼容多种后端的Keras库用法完全一样, 随着谷歌对Keras的收购,Keras库2.3.0版本后也将不再进行更新,用户应当使用tf.keras而不是使用pip安装的Keras. - - -```python - -``` - - ### 三,本书📖面向读者 👼 @@ -67,12 +63,6 @@ tf.keras绝大部分功能和兼容多种后端的Keras库用法完全一样, - - -```python - -``` - ### 四,本书写作风格 🍉 @@ -98,10 +88,6 @@ tf.keras绝大部分功能和兼容多种后端的Keras库用法完全一样, ### 五,本书学习方案 ⏰ -```python - -``` - **1,学习计划** 本书是作者利用工作之余和疫情放假期间大概2个月写成的,大部分读者应该在30天可以完全学会。 @@ -159,12 +145,20 @@ tf.keras绝大部分功能和兼容多种后端的Keras库用法完全一样, **2,学习环境** + +本书全部源码在jupyter中编写测试通过,建议通过git克隆到本地,并在jupyter中交互式运行学习。 + +为了直接能够在jupyter中打开markdown文件,建议安装jupytext,将markdown转换成ipnb。 + ```python -#建议在jupyter notebook 上安装最新版本tensorflow 测试本书中的代码 -!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U tensorflow +#克隆本书源码到本地 +!git clone https://github.com/lyhue1991/eat_tensorflow2_in_30_days #建议在jupyter notebook 上安装jupytext,以便能够将本书各章节markdown文件视作ipynb文件运行 !pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U jupytext + +#建议在jupyter notebook 上安装最新版本tensorflow 测试本书中的代码 +!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U tensorflow ``` ```python diff --git a/data/image-20200321085343234.png b/data/image-20200321085343234.png new file mode 100644 index 00000000..b95ff6b6 Binary files /dev/null and b/data/image-20200321085343234.png differ diff --git a/data/tf_model_savedmodel/variables/checkpoint b/data/tf_model_savedmodel/variables/checkpoint deleted file mode 100644 index 44026de6..00000000 --- a/data/tf_model_savedmodel/variables/checkpoint +++ /dev/null @@ -1,2 +0,0 @@ -model_checkpoint_path: "variables" -all_model_checkpoint_paths: "variables" diff --git "a/\344\272\224\343\200\201TensorFlow\347\232\204\344\270\255\351\230\266API.md" "b/\344\272\224\343\200\201TensorFlow\347\232\204\344\270\255\351\230\266API.md" index 9c49068a..842db324 100644 --- "a/\344\272\224\343\200\201TensorFlow\347\232\204\344\270\255\351\230\266API.md" +++ "b/\344\272\224\343\200\201TensorFlow\347\232\204\344\270\255\351\230\266API.md" @@ -1,7 +1,5 @@ # 五、TensorFlow的中阶API - - TensorFlow的中阶API主要包括: * 数据管道(tf.data) diff --git "a/\345\205\255\343\200\201TensorFlow\347\232\204\351\253\230\351\230\266API.md" "b/\345\205\255\343\200\201TensorFlow\347\232\204\351\253\230\351\230\266API.md" index 8442cf65..4b188531 100644 --- "a/\345\205\255\343\200\201TensorFlow\347\232\204\351\253\230\351\230\266API.md" +++ "b/\345\205\255\343\200\201TensorFlow\347\232\204\351\253\230\351\230\266API.md" @@ -1,7 +1,5 @@ # 六、TensorFlow的高阶API - - TensorFlow的高阶API主要是tensorflow.keras.models. 本章我们主要详细介绍tensorflow.keras.models相关的以下内容。 diff --git "a/\345\233\233\343\200\201TensorFlow\347\232\204\344\275\216\351\230\266API.md" "b/\345\233\233\343\200\201TensorFlow\347\232\204\344\275\216\351\230\266API.md" index 5d1e6618..9c828ea7 100644 --- "a/\345\233\233\343\200\201TensorFlow\347\232\204\344\275\216\351\230\266API.md" +++ "b/\345\233\233\343\200\201TensorFlow\347\232\204\344\275\216\351\230\266API.md" @@ -1,7 +1,5 @@ # 四、TensorFlow的低阶API - - TensorFlow的低阶API主要包括张量操作,计算图和自动微分。 如果把模型比作一个房子,那么低阶API就是【模型之砖】。