---
template: overrides/blogs.html
tags:
- deep learning
- tensorflow
---
# 读《30天吃掉那只TensorFlow2》
!!! info
作者:Void,发布于2021-12-01,阅读时间:约6分钟,微信公众号文章链接:[:fontawesome-solid-link:](https://mp.weixin.qq.com/s/cw2DW7al5nJV93roAN_gwg)
## 1 前言
在工作中,需要使用TensorFlow来构建模型(由于不断内卷,需要模型又Fancy效果又好)。碰到问题,搜索他人的回答或是TensorFlow的官方文档是解决问题的高效方法。但是面向搜索引擎编程,不免觉得获取的知识有点破碎。
为了构建一个较为完整的TensorFlow的知识体系,而又不一上来就陷入官方文档难以自拔,作者找到了《30天吃掉那只TensorFlow2》这一关于TensorFlow的[开源工具书](https://jackiexiao.github.io/eat_tensorflow2_in_30_days/chinese/ '30天吃掉那只TensorFlow2')。
这一项目不仅提供了文档,还提供了环境,可以直接运行示例。事实上,有一定基础的读者也并不需要30天就能完成阅读。有一定基础,想快速构建TensorFlow知识体系的读者不妨吃下这颗安利。
## 2 建模流程
本书首先给出了常见任务应用TensorFlow的建模流程,包括结构化数据、图片、文本、时间序列数据。具体的技术细节可以先不做理会,如LSTM、CNN等,这一部分只是为了展示TensorFlow使用场景广、可以应用于主流的不同任务。
## 3 核心概念
这一部分介绍了TensorFlow的核心组成:张量,计算图以及自动微分。
张量可以理解为多维数组,是TensorFlow中的基本数据结构。
计算图就是整个计算关系。TensorFlow1.0采用的是静态计算图,在创建完计算图后,需要开启一个session才会显式执行。进入TensorFlow2.0后,为了方便调试,TensorFlow采用了动态计算图。由于动态计算图效率会低一些,TensorFlow允许我们使用@tf.function装饰器构建静态计算图,也被称作Autograph。
神经网络在更新权重时,很重要的一步是求解梯度。TensorFlow提供了tf.GradientTape(梯度磁带),使我们可以很方便的求解梯度,更新网络。
## 4 层次结构
第三部分介绍了TensorFlow的层次结构,主要是低、中、高三阶的API示例。
低阶API直接操作张量、计算图和自动微分。虽然显得有些复杂和原始,但是是我们离开新手村,自定义模型时不可或缺的工具。
如定义模型:
```python
w = tf.Variable(tf.random.normal(w0.shape))
b = tf.Variable(tf.zeros_like(b0,dtype = tf.float32))
# 定义模型
class LinearRegression:
#正向传播
def __call__(self,x):
return x@w + b
# 损失函数
def loss_func(self,y_true,y_pred):
return tf.reduce_mean((y_true - y_pred)**2/2)
model = LinearRegression()
```
中阶API提供了更高程度的封装,如损失函数、优化器等组件。
```python
model = layers.Dense(units = 1)
model.build(input_shape = (2,)) #用build方法创建variables
model.loss_func = losses.mean_squared_error
model.optimizer = optimizers.SGD(learning_rate=0.001)
```
我们只需要选择想要的优化器,调节学习速率即可。并不需要关心优化器本身是如何实现的。这些小组件给我们的建模提供了很多便利。
高阶API主要是模型类的接口。主要包括以下三点:
- 序列化模型
```python
model = models.Sequential()
model.add(layers.Dense(1,input_shape =(2,)))
model.summary()
```
- 函数式API
```python
input_tensor = Input(shape=(64, ))
z = layers.Dense(32, activation='relu')(input_tensor)
z = layers.Dense(32, activation='relu')(z)
y = layers.Dense(10, activation='softmax')(z)
from keras.models import Model
model = Model(input_tensor, y)
```
- 继承Model基类,自定义模型
```python
class DNNModel(models.Model):
def __init__(self):
super(DNNModel, self).__init__()
def build(self,input_shape):
self.dense1 = layers.Dense(4,activation = "relu",name = "dense1")
self.dense2 = layers.Dense(8,activation = "relu",name = "dense2")
self.dense3 = layers.Dense(1,activation = "sigmoid",name = "dense3")
super(DNNModel,self).build(input_shape)
# 正向传播
@tf.function(input_signature=[tf.TensorSpec(shape = [None,2], dtype = tf.float32)])
def call(self,x):
x = self.dense1(x)
x = self.dense2(x)
y = self.dense3(x)
return y
model = DNNModel()
model.build(input_shape =(None,2))
model.summary()
```
## 5 API
最后是低、中、高阶API具体的介绍。感兴趣的读者可以自行阅读。有示例、有中文,读起来感觉轻松又愉快。
## 6 总结
《30天吃掉那只TensorFlow2》这本工具书可以让我们很快对TensorFlow建立起知识框架。内容不会太多,深度也足够。适合有一定基础,又想进一步了解TensorFlow的读者。