[tensorflow]tensorflow 顺序模型(Sequential model)

注意:采用tensorflow 2.1.0

1、适用顺序模型的情况

顺序模型适用于简单的层堆栈,其中每一层正好具有一个输入张量和一个输出张量。

例如:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 定义3层图形的模型

model = keras.Sequential( [

layers.Dense(2, activation="relu", name="layer1"),

layers.Dense(3, activation="relu", name="layer2"),

layers.Dense(4, name="layer3"),

]
)
# 实例化模型
x = tf.ones((3, 3))
y = model(x)

如下图,输入一个3X3矩阵,经过3个稠密图层后,得到4X4的矩阵结果

[tensorflow]tensorflow 顺序模型(Sequential model)_第1张图片

2、不适用顺序模型的情况:

  1. 模型有多个输入或多个输出
  2. 任何一层都有多个输入或多个输出
  3. 需要进行图层共享
  4. 需要非线性拓扑(例如,残余连接,多分支模型)

 

3、创建顺序模型的方式

3.1通过传入列表

通过将图层列表传递给Sequential构造函数来创建Sequential模型

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential(
[
 layers.Dense(2, activation="relu"),
 layers.Dense(3, activation="relu"),
 layers.Dense(4),]
)

3.2通过add()方法创建一个顺序模型

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential(name="my_sequential")
model.add(layers.Dense(2, activation="relu", name="layer1"))
model.add(layers.Dense(3, activation="relu", name="layer2"))
model.add(layers.Dense(4, name="layer3"))

3.3 顺序模型的常用方法

model.layers #获取图层列表
model.pop() #删除模型的最后加入的图层
layer.weights #图层的权重,默认没有权重

4、图层的权重

通常,Keras中的所有图层都需要知道其输入的形状,以便能够创建其权重。以下方法创建的图层最初没有权重:layer = layers.Dense(3) layer.weights

权重的形状取决于输入的形状,在首次调用输入时创建其权重,如下面对权重输入一个1X4的矩阵,图层就有了权重。

x = tf.ones((1, 4))
y = layer(x)
layer.weights 

因此,当实例化没有输入形状的顺序模型时,因为它没有权重,调用model.weights会导致错误,如:

model = keras.Sequential(
 [
 layers.Dense(2, activation="relu"),
 layers.Dense(3, activation="relu"),
 layers.Dense(4),]
)  # No weights at this stage!
# 因为还没有输入,调用权重函数是报错
# model.weights
# 同样不能调用模型的概要函数
# model.summary()
# 输入形状(相当于实例化模型)
x = tf.ones((1, 4))
y = model(x)
len(model.weights)) 

如果事前已经确定了权重,可以在声明图层时指定input_shape参数,相当预定义形状,这样的图层始终有权重。

model = keras.Sequential()
model.add(layers.Dense(2, activation="relu", input_shape=(4,)))

5、常用的调试方法

创建模型户后,通过add() 逐渐添加图层,同时通过 summary()打印模型概要,清晰知道图层堆栈的采用过程。

6、通过顺序模型进行特征抽取

一旦建立了顺序模型,可以把它当做API使用。每个图层都具有输入和输出属性。 这些属性可用于执行整洁的事情,例如创建一个模型,以提取顺序模型中所有中间层的输出:

initial_model = keras.Sequential(
    [
        keras.Input(shape=(250, 250, 3)),
        layers.Conv2D(32, 5, strides=2, activation="relu", name="my_intermediate_layer"),
        layers.Conv2D(32, 3, activation="relu")
        layers.Conv2D(32, 3, activation="relu"),
    ]
)
feature_extractor = keras.Model(
    inputs=initial_model.inputs,
#抽取所以图层的输出
    outputs=[layer.output for layer in initial_model.layers],
#抽取某个图层的输出
#outputs=initial_model.get_layer(name="my_intermediate_layer").output,
)
# 输出图层特征.
x = tf.ones((1, 250, 250, 3))
features = feature_extractor(x)

7、顺序模型的选择性训练

训练模型时,可以有选择地只训练某些图层,只要把暂时不训练图层的layer.trainable的属性设置为False即可,如下面的例子,只训练最后一个图层

model = keras.Sequential([
    keras.Input(shape=(784))
    layers.Dense(32, activation='relu'),
    layers.Dense(32, activation='relu'),
    layers.Dense(32, activation='relu'),
    layers.Dense(10),

])
model.load_weights()
# 除了最后一个图层,冻结其他图层.
for layer in model.layers[:-1]:
  layer.trainable = False
# 编译和训练模型
model.compile()
model.fit()

你可能感兴趣的:(tensorflow,python)