【TensorFlow2.0】如何搭建网络模型?

大家好,这是专栏《TensorFlow2.0》的第四篇文章,讲述网络模型的搭建。

我们知道在不考虑输入层的情况下,一个典型的卷积神经网络通常由若干个卷积层、激活层、池化层及全连接层组成,无论是最经典的LeNet5,还是前两天刚出现的MobileNet V3,无一不都包含这些层。今天就带大家学习下如何使用TensorFlow2.0搭建卷积神经网络模型。

作者&编辑 | 汤兴旺 

上一期,我们讲解了如何使用TensorFlow2.0从自己的磁盘读取数据,今天我们就来看看如何使用层来搭建网络。


1 使用Keras API构建网络模型架构

在Keras API中,定义网络是比较简单的,我们主要用到的就是Sequential类下面看看如何具体使用它来定义网络:

from tensorflow.keras import Sequential

conv_net = Sequential([

        layers.Dense(32,activation = "relu",input_shape = (784,)),

        layers.Dense(10,activation = "softmax")])

我们可以把Sequential理解为一个容器,然后把layers搭建的每层模型都送进这个容器中,构成整个网络模型。值得注意的layers搭建的每层模型要想放进这个容器中必须是list结构。

另外我们需要搭建的卷积层,全连接层,池化层等都在layers这个类中。下面我们看一个包含卷积层,全连接层,池化层比较完整的结构,如下:

from tensorflow.keras import Sequential

conv_layers = [

conv_net =Sequential(conv_layers)

fc_net = Sequential([

上面的模型中我们首先通过layers.Conv2D()、layers.MaxPool2D()构建模型的卷积网络层conv_layers,注意看我是把这个层放在了一个list中的,然后我把这个list即conv_layers放进了Sequential这个容器构建成了卷积网络conv_net。

卷积层完成构建后,我们通过layers.Dense添加全连接层,这样一个完整的结构就完成了。

基本的模型完成了搭建后,我们看前向处理是怎么做的,即数据如何从卷积层一步步传到最后的全连接层,最后输出一个预测值。

out = conv_net(x)

out = tf.reshape(out, [-1, 512])

logits = fc_net(out)

上面我们假设输入x是[1,32,32,3],即1张3通道大小为32*32的图片,经过卷积层后的输出为out,现在我们看看out是多少,查看方法如下:

x = tf.random.normal([1,32,32,3])

我们通过上面的代码很容易得到out.shape = [1,1,1,512]

为了能将卷积后的结果与全连接层相连,我们需要将它展平,即out = tf.reshape(out, [-1, 512]),最后我们将打平后的结果传递到全连接层网络fc_net得到预测值。

上面我们通过Sequential类完成了一个完整的模型搭建,你掌握了吗?

2 定义自己的网络层架构

上面我们通过Sequential类完成了一个简单的线性模型的搭建,下面我们看如何搭建自己的一个模型(非线性模型)。这里我们以ResNet系列网络为例。

import tensorflow as tf

filter_num,(3,3),strides=stride,padding="same")

def resnet34():

我们知道在ResNet中有一个基本的单元叫做basicBlock

【TensorFlow2.0】如何搭建网络模型?_第1张图片

多个basicBlock的叠加就组成了resblock,而ResNet系列网络就是由多个不同resBlock组成的。

上面的代码中我们定义了一个基本的类basicBlock,它必须继承layers.Layer或者keras.Model这个类,也就是说所有的网络自定义都会继承这个类中的一个,并实现super方法,如下:

super(BasicBlock,self).__init__()

basicBlock基本结构完成后,我们需要实现前向运算,即call函数,如下:

def call(self,inputs,training=None):

从上面的代码可以看出call函数是比较简单的,串接各个网络层就可以了,这里不再详细说明。这样我们resnet的基本结构basicBlock就完成了构建。后面的resBlock实际上就是BasicBlock的叠加,实现的方法是一样的,就是定义个基本的类,并继承layers.Layer或者keras.Model这个类,再实现super方法。最后通过call函数完成前向运算。

总结

本期我们详细介绍了如何使用TensorFlow2.0完成网络模型的搭建。


下期预告:使用TensorFlow2.0完成从模型自定义到测试。

直播预告

【TensorFlow2.0】如何搭建网络模型?_第2张图片

【TensorFlow2.0】如何搭建网络模型?_第3张图片

今日看图猜技术

【TensorFlow2.0】如何搭建网络模型?_第4张图片

网络结构

【TensorFlow2.0】如何搭建网络模型?_第5张图片

有三AI生态

【TensorFlow2.0】如何搭建网络模型?_第6张图片

转载文章请后台联系

侵权必究

更多请关注知乎专栏《有三AI学院》

【TensorFlow2.0】如何搭建网络模型?_第7张图片

【TensorFlow2.0】如何搭建网络模型?_第8张图片

640?wx_fmt=png

640?wx_fmt=png

往期精选

  • 有三AI一周年了,说说我们的初衷,生态和愿景

  • 【TensorFlow2.0】TensorFlow2.0专栏上线,你来吗?

  • 【TensorFlow2.0】以后我们再也离不开Keras了?

  • 【TensorFlow2.0】数据读取与使用方式

  • 【图像分割模型】从FCN说起

  • 【图像分割模型】编解码结构SegNet

  • 【图像分割模型】感受野与分辨率的控制术—空洞卷积

  • 【图像分割模型】快速道路场景分割—ENet

  • 【图像分割模型】以RNN形式做CRF后处理—CRFasRNN

  • 【图像分割模型】多感受野的金字塔结构—PSPNet

  • 【图像分割模型】全局特征与局部特征的交响曲—ParseNet

  • 【AI初识境】从3次人工智能潮起潮落说起

  • 【AI初识境】从头理解神经网络-内行与外行的分水岭

  • 【AI初识境】近20年深度学习在图像领域的重要进展节点

  • 【AI初识境】激活函数:从人工设计到自动搜索

  • 【AI初识境】什么是深度学习成功的开始?参数初始化

  • 【AI初识境】深度学习模型中的Normalization,你懂了多少?

  • 【AI初识境】为了围剿SGD大家这些年想过的那十几招

  • 【AI初识境】被Hinton,DeepMind和斯坦福嫌弃的池化,到底是什么?

  • 【AI初识境】如何增加深度学习模型的泛化能力

  • 【AI初识境】深度学习模型评估,从图像分类到生成模型

  • 【AI初识境】深度学习中常用的损失函数有哪些?

  • 【AI初识境】给深度学习新手做项目的10个建议

  • 【完结】深度学习CV算法工程师从入门到初级面试有多远,大概是25篇文章的距离

  • 【完结】优秀的深度学习从业者都有哪些优秀的习惯

  • 【完结】给新手的12大深度学习开源框架快速入门项目

  • 【完结】总结12大CNN主流模型架构设计思想

  • 【AI不惑境】数据压榨有多狠,人工智能就有多成功

  • 【AI不惑境】网络深度对深度学习模型性能有什么影响?

  • 【AI不惑境】网络的宽度如何影响深度学习模型的性能?

  • 【AI不惑境】学习率和batchsize如何影响模型的性能?

  • 【AI不惑境】学习率和batchsize如何影响模型的性能?

你可能感兴趣的:(【TensorFlow2.0】如何搭建网络模型?)