使用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
如果你耐心地看到这里,恭喜你,又获得了一项新技能,给自己点个赞吧,爱你哟么么哒