全面小白分析如何使用tensorflow2.0中的函数式API创建任意结构模型

使用tensorflow2.0中的函数式API创建任意结构模型这种方法比上一种使用Sequential按层顺序搭建神经网络更加灵活,但最终如果我们想要搭建例如resnet这种网络,这些方法都是蕴含在里面的,无所谓谁跟谁。上一篇博客地址:全面小白分析如何使用tensorflow2.0中的Sequential按层顺序创建模型

当看到神经网络结构图的时候,我们思考最多的事情是什么?一下子看到那么复杂的结构图,自己是不是谎了?

别谎,你首先应该思考,这个网络的输入和输出分别是什么?这个网络不管多复杂,还不是一层一层搭建起来的。所以我们首先思考,输入层怎么搭建?输入层之后的第二层又该如何跟第一层结合,然后又该跟第三层如何结合?

对于使用Sequential对象这种方法而言,我们不是很明确中间出现哪些数据,也使用不到中间的数据。例如下面的代码,你如何使用带第二层的数据,是不是看起来一点头脑都没有。它只给你明确了最终输入和最终输出而已。这就是为啥我们诞生了今天要重点讲的第二种方法。

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D  # 卷积层
from tensorflow.keras.layers import MaxPool2D  # 最大池化
from tensorflow.keras.layers import Flatten  # 平铺层
from tensorflow.keras.layers import Dense  # 全连接层

# todo 我们如何把这些材料搭建起来?使用列表方式,总共一步,步骤一

# 步骤一,实例化一个Sequential对象,并传入一个列表

my_name_is_learn_model = Sequential(
    [
        Dense(units=32, name='dense_1'),
        Dense(units=64, name='dense_2'),
        Dense(units=128, name='dense_3'),
        Dense(units=10, name='dense_4')
    ]
)

# 步骤二,使用这个神经网络
import tensorflow as tf

x = tf.Variable(initial_value=tf.random.normal(shape=(32, 784)))  # 随便构造一个数据
out = my_name_is_learn_model(x)  # 将数据输入神经网络得到输出
pass

使用函数式API创建任意结构的模型我们还是需要层对象,例如下面这些:

from tensorflow.keras.layers import Conv2D  # 卷积层
from tensorflow.keras.layers import MaxPool2D  # 最大池化
from tensorflow.keras.layers import Flatten  # 平铺层
from tensorflow.keras.layers import Dense  # 全连接层

更多层对象的解释和详情我在另外一篇博客上有详细介绍:都2020年了,汇总tf.keras模型层layers都有哪些

有了层对象之后就相当于建房子有了瓷砖,接下来演示如何搭建,注意看代码注释,注意看代码注释,注意看代码注释

from tensorflow.keras.layers import Conv2D  # 卷积层
from tensorflow.keras.layers import MaxPool2D  # 最大池化
from tensorflow.keras.layers import Flatten  # 平铺层
from tensorflow.keras.layers import Dense  # 全连接层

# todo 使用函数式api,我们如何把这些材料搭建起来?

# 步骤一,定义输入层
from tensorflow.keras.layers import Input
input_img = Input(shape=(32, 784))

# 步骤二,定义第一个层, 格式如下:输出 = 层对象( )(输入)
dense1 = Dense(units=32, name='dense_1')(input_img)

# 步骤三,按照步骤二的样子定义自己想要的层级和结构
dense2 = Dense(units=64, name='dense2')(dense1)  # 输入是dense1
dense3 = Dense(units=128, name='dense3')(dense2)  # 输入是dense2
dense4 = Dense(units=10, name='dense4')(dense3)  # 输入是dense3

# 步骤四,定义自己输出的变量
from tensorflow.keras import models
# model = models.Model(inputs=input_img, outputs=dense2)  # 输入是input_img, 输出是中间层结果dense2
# model = models.Model(inputs=input_img, outputs=dense3)  # 输入是input_img, 输出是中间层结果dense3
my_name_is_learn_model = models.Model(inputs=input_img, outputs=dense4)  # 输入是input_img, 输出是中间层结果dense4
"""
当然你也可以将中间几个值整合一下再输出也可以,例如维度的堆叠
""" 

# 步骤五,使用这个神经网络
import tensorflow as tf

x = tf.Variable(initial_value=tf.random.normal(shape=(32, 784)))  # 随便构造一个数据
out = my_name_is_learn_model(x)  # 将数据输入神经网络得到输出

# 输入的数据要跟输入层的shape要求一致,输出就是自己指定的输出
pass

如果你耐心地看到这里,恭喜你,又获得了一项新技能,给自己点个赞吧,爱你哟么么哒

你可能感兴趣的:(计算机视觉,tensorflow,神经网络)