Skip to content

读《30天吃掉那只TensorFlow2》

Info

作者:Void,发布于2021-12-01,阅读时间:约4分钟,微信公众号文章链接:

1 前言

在工作中,需要使用TensorFlow来构建模型(由于不断内卷,需要模型又Fancy效果又好)。碰到问题,搜索他人的回答或是TensorFlow的官方文档是解决问题的高效方法。但是面向搜索引擎编程,不免觉得获取的知识有点破碎。

为了构建一个较为完整的TensorFlow的知识体系,而又不一上来就陷入官方文档难以自拔,作者找到了《30天吃掉那只TensorFlow2》这一关于TensorFlow的开源工具书

这一项目不仅提供了文档,还提供了环境,可以直接运行示例。事实上,有一定基础的读者也并不需要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直接操作张量、计算图和自动微分。虽然显得有些复杂和原始,但是是我们离开新手村,自定义模型时不可或缺的工具。

如定义模型:

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提供了更高程度的封装,如损失函数、优化器等组件。

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主要是模型类的接口。主要包括以下三点:

  • 序列化模型
    model = models.Sequential()
    model.add(layers.Dense(1,input_shape =(2,)))
    model.summary()
    
  • 函数式API
    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基类,自定义模型
    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的读者。


Viewed times

Comments