注意:采用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的矩阵结果
2、不适用顺序模型的情况:
- 模型有多个输入或多个输出
- 任何一层都有多个输入或多个输出
- 需要进行图层共享
- 需要非线性拓扑(例如,残余连接,多分支模型)
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()