看了网上很多关于Tensorflow的Sequential与Model的讲解,绝大部分都是照搬官方说明讲一遍。不想想要是官方说明说的清还会来看你的讲解?

两者简单说明

tf.keras.Sequential是通过序列层来构建模型的,其本身返回的还是一个继承tf.keras.Model的实例。
tf.keras.Model是一个模型类,作用就是来构建模型的。

输入与输出

对于任何模型,最关键的就是其输入与输出,Tensorflow从设计上就通过类的参数来强势让你自己先理清什么是输入与输出。

对于tf.keras.Sequential:

如果输入的是一个层,则返回模型内部层处理后"最后的层",
如果输入的是一个"具体的值",则返回该值经过模型内部层处理后的"最后值"

import tensorflow as tf

model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer((28,28,3)))
model.add(tf.keras.layers.Dense(100,activation='relu'))
model.add(tf.keras.layers.Dense(32,activation='relu'))
model.add(tf.keras.layers.Dense(16,activation='relu'))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))

输入一个层,返回输出最后一个层结果,可以看见,输入shape要求是(,28,28,3),输出变成(,28,28,1)与最后一个Dense层的输出保持一致。

m1 = model(tf.keras.layers.Input(shape=(28,28,3)))
m1
#<tf.Tensor 'sequential/dense_3/Sigmoid:0' shape=(None, 28, 28, 1) dtype=float32>

输入一个值,则返回该值经过Sequential内部一些列层后得到的最终值.

value = tf.random.normal((3,28,28,3))
value.shape
#TensorShape([3, 28, 28, 3])

m2 = model(value)
m2
#
<tf.Tensor: shape=(3, 28, 28, 1), dtype=float32, numpy=
array([[[[0.51777893],
         [0.5383248 ],
         [0.5338475 ],
         ...,
         [0.52277124],
         [0.51066947],
         [0.50479525]],

        [[0.5285166 ],
         [0.61327916],
         [0.52412134],
         ...,
         [0.5799711 ],
         [0.5148077 ],
         [0.5191372 ]],

        [[0.5803058 ],
         [0.5223268 ],
         [0.53054047],
         ...,
         [0.5593277 ],
         [0.5683962 ],
         [0.5282355 ]],
show more (open the raw output data in a text editor) ...

         [0.6011244 ],
         [0.51908755],
         ...,
         [0.5288701 ],
         [0.5402269 ],
         [0.52987367]]]], dtype=float32)>
对于tf.keras.Model:

它是用来构建模型的,有两种方式构建:
一种是直接通过Model构造函数直接构建,
一种是通过继承Model类来构建。
这里主要说一下通过构造函数直接构建模型,因为这个是比较让人迷惑的方式。该方法为:

model = Model(inputs,outputs)

说明:
Model只有两个参数,第一个是输入,第二个是输出,每个参数可以是一个列表或tuple,也可以是一个元素。
这里Model()跟我们常见的输入因得到果这个思路不一样。它的参数既需要输入元素,同时又需要最终输出结果。即想要构建一个模型,你既要告诉我输入具体是什么,还得告诉我具体的输出是什么。它就像一个功能工具,比如说炒锅,你要告诉它输入是 鸡蛋+米饭,要得到蛋炒饭,它才会给你做一个蛋炒饭而不是鸡蛋锅巴。你告诉它输入是 鸡蛋+水,要得到水煮蛋,它才会给你弄个水煮蛋而不是鸡蛋汤。
将完整的Inputs与Outputs传入Model的整个过程才算是模型的构建。

注意Sequential与Model的混合使用

如果不理解Sequential与Model的机制,这种组合构建模型是最让人迷惑的地方。
只需要记住两句话:
1.如果要使用tf.keras.Model的构造方法来直接构造模型,输入与输出必须是"层",
2.此时通过tf.keras.Sequential来构建的必然是最终的输出层,用来给Model作为其Outputs的.

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐