Model 类keras.Model()
一个模型,用于将层分组到一个具有训练/推理功能的对象中。
实例化一个 Model 有三种方法:
您从 Input 开始,链接层调用以指定模型的正向传播,最后,您可以从输入和输出来创建模型。
inputs = keras.Input(shape=(37,))
x = keras.layers.Dense(32, activation="relu")(inputs)
outputs = keras.layers.Dense(5, activation="softmax")(x)
model = keras.Model(inputs=inputs, outputs=outputs)
注意:仅支持输入张量的字典、列表和元组。不支持嵌套输入(例如,列表的列表或字典的字典)。
通过使用中间张量,还可以创建新的函数式 API 模型。这使您可以快速提取模型的子组件。
示例
inputs = keras.Input(shape=(None, None, 3))
processed = keras.layers.RandomCrop(width=128, height=128)(inputs)
conv = keras.layers.Conv2D(filters=32, kernel_size=3)(processed)
pooling = keras.layers.GlobalAveragePooling2D()(conv)
feature = keras.layers.Dense(10)(pooling)
full_model = keras.Model(inputs, feature)
backbone = keras.Model(processed, conv)
activations = keras.Model(conv, feature)
请注意,backbone 和 activations 模型不是使用 keras.Input 对象创建的,而是使用源自 keras.Input 对象的张量创建的。在底层,层和权重将在这些模型之间共享,因此用户可以训练 full_model,并使用 backbone 或 activations 进行特征提取。模型的输入和输出也可以是嵌套的张量结构,创建的模型是标准的函数式 API 模型,支持所有现有 API。
Model 类在这种情况下,您应该在 __init__() 中定义您的层,并且您应该在 call() 中实现模型的正向传播。
class MyModel(keras.Model):
def __init__(self):
super().__init__()
self.dense1 = keras.layers.Dense(32, activation="relu")
self.dense2 = keras.layers.Dense(5, activation="softmax")
def call(self, inputs):
x = self.dense1(inputs)
return self.dense2(x)
model = MyModel()
如果您继承 Model,您可以在 call() 中选择性地包含一个 training 参数(布尔值),您可以使用它来指定训练和推理时的不同行为。
class MyModel(keras.Model):
def __init__(self):
super().__init__()
self.dense1 = keras.layers.Dense(32, activation="relu")
self.dense2 = keras.layers.Dense(5, activation="softmax")
self.dropout = keras.layers.Dropout(0.5)
def call(self, inputs, training=False):
x = self.dense1(inputs)
x = self.dropout(x, training=training)
return self.dense2(x)
model = MyModel()
模型创建后,您可以使用 model.compile() 配置模型的损失和指标,使用 model.fit() 训练模型,或使用模型进行预测 model.predict()。
Sequential 类此外,keras.Sequential 是模型的一个特例,其中模型纯粹是单输入、单输出层的堆栈。
model = keras.Sequential([
keras.Input(shape=(None, None, 3)),
keras.layers.Conv2D(filters=32, kernel_size=3),
])
summary 方法Model.summary(
line_length=None,
positions=None,
print_fn=None,
expand_nested=False,
show_trainable=False,
layer_range=None,
)
打印网络的字符串摘要。
参数
[0.3, 0.6, 0.70, 1.]。默认为 None。stdout。如果在您的环境中 stdout 不起作用,请将其更改为 print。它将在摘要的每一行上被调用。您可以将其设置为自定义函数以捕获字符串摘要。False。False。layer_range[0] 的元素,结束谓词将是最后一个匹配 layer_range[1] 的元素。默认情况下,None 考虑模型的所有层。引发
summary()。get_layer 方法Model.get_layer(name=None, index=None)
根据名称(唯一)或索引检索一个层。
如果同时提供了 name 和 index,则 index 具有优先权。索引基于水平图遍历的顺序(自底向上)。
参数
返回
一个层实例。
get_state_tree 方法Model.get_state_tree(value_format="backend_tensor")
检索模型变量的树状结构。
此方法允许检索不同的模型变量(可训练、不可训练、优化器和指标)。变量以嵌套字典格式返回,其中键对应于变量名称,值对应于变量的嵌套表示。
返回
"backend_tensor"、"numpy_array" 中的一个。作为嵌套状态树叶子返回的数组类型。示例
model = keras.Sequential([
keras.Input(shape=(1,), name="my_input"),
keras.layers.Dense(1, activation="sigmoid", name="my_dense"),
], name="my_sequential")
model.compile(optimizer="adam", loss="mse", metrics=["mae"])
model.fit(np.array([[1.0]]), np.array([[1.0]]))
state_tree = model.get_state_tree()
返回的 state_tree 字典如下所示:
{
'metrics_variables': {
'loss': {
'count': ...,
'total': ...,
},
'mean_absolute_error': {
'count': ...,
'total': ...,
}
},
'trainable_variables': {
'my_sequential': {
'my_dense': {
'bias': ...,
'kernel': ...,
}
}
},
'non_trainable_variables': {},
'optimizer_variables': {
'adam': {
'iteration': ...,
'learning_rate': ...,
'my_sequential_my_dense_bias_momentum': ...,
'my_sequential_my_dense_bias_velocity': ...,
'my_sequential_my_dense_kernel_momentum': ...,
'my_sequential_my_dense_kernel_velocity': ...,
}
}
}
}
set_state_tree 方法Model.set_state_tree(state_tree)
为模型的变量分配值。
此方法接受一个包含嵌套变量值的字典,该字典表示模型的状态树,并将其分配给模型的相应变量。字典键表示变量名称(例如,'trainable_variables'、'optimizer_variables'),值是包含变量路径及其相应值的嵌套字典。
参数