About Keras models

Keras中有两种主要的模型类型: 顺序模型与功能性API一起使用的Model类 .

这些模型具有许多共同的方法和属性:

  • model.layers是组成模型的层的扁平列表.
  • model.inputs是模型的输入张量的列表.
  • model.outputs是模型的输出张量的列表.
  • model.summary()打印模型的摘要表示. 对于具有多个输出的图层,由于尺寸限制,将显示multiple而不是每个单独的输出形状. utils.print_summary的快捷方式
  • model.get_config()返回包含模型配置的字典. 可以通过以下方式从其配置中重新初始化模型:
config = model.get_config()
model = Model.from_config(config)
# or, for Sequential:
model = Sequential.from_config(config)
  • model.get_weights()以Numpy数组的形式返回模型中model.get_weights()重张量的列表.
  • model.set_weights(weights)从Numpy数组列表中设置模型的权重值. 列表中的数组应具有与get_weights()返回的数组相同的形状.
  • model.to_json()以JSON字符串形式返回模型的表示形式. 注意,表示不包括权重,仅包括体系结构. 您可以通过以下方式从JSON字符串中重新实例化同一模型(具有重新初始化的权重):
from keras.models import model_from_json

json_string = model.to_json()
model = model_from_json(json_string)
  • model.to_yaml()以YAML字符串形式返回模型的表示形式. 注意,表示不包括权重,仅包括体系结构. 您可以通过以下方式从YAML字符串中重新实例化同一模型(具有重新初始化的权重):
from keras.models import model_from_yaml

yaml_string = model.to_yaml()
model = model_from_yaml(yaml_string)
  • model.save_weights(filepath)将模型的权重另存为HDF5文件.
  • model.load_weights(filepath, by_name=False)从HDF5文件(由save_weights创建model.load_weights(filepath, by_name=False)加载模型的权重. 默认情况下,该架构应保持不变. 要将权重加载到不同的体系结构中(共有一些层),请使用by_name=True仅加载具有相同名称的那些层.

注意:另请参阅如何安装HDF5或h5py将模型保存在Keras中? 在FAQ中获得有关如何安装h5py .

Model subclassing

除了这两种类型的模型,您还可以通过对Model类进行子类化并在call方法中实现自己的前向传递来创建自己的完全可自定义模型(在Keras 2.2.0中引入了Model子类化API).

这是一个简单的多层感知器模型的示例,该模型编写为Model子类:

import keras

class SimpleMLP(keras.Model):

    def __init__(self, use_bn=False, use_dp=False, num_classes=10):
        super(SimpleMLP, self).__init__(name='mlp')
        self.use_bn = use_bn
        self.use_dp = use_dp
        self.num_classes = num_classes

        self.dense1 = keras.layers.Dense(32, activation='relu')
        self.dense2 = keras.layers.Dense(num_classes, activation='softmax')
        if self.use_dp:
            self.dp = keras.layers.Dropout(0.5)
        if self.use_bn:
            self.bn = keras.layers.BatchNormalization(axis=-1)

    def call(self, inputs):
        x = self.dense1(inputs)
        if self.use_dp:
            x = self.dp(x)
        if self.use_bn:
            x = self.bn(x)
        return self.dense2(x)

model = SimpleMLP()
model.compile(...)
model.fit(...)

层是在__init__(self, ...)中定义的,而前向传递是在call(self, inputs) . 在call ,您可以通过调用self.add_loss(loss_tensor)来指定自定义损失(就像在自定义层中一样).

在子类模型中,模型的拓扑定义为Python代码(而不是静态的层图). 这意味着无法检查或序列化模型的拓扑. 结果,以下方法和属性不适用于子类化模型

  • model.inputs and model.outputs.
  • model.to_yaml() and model.to_json()
  • model.get_config() and model.save().

关键点:为作业使用正确的API. Model子类化API可以为您实现复杂模型提供更大的灵活性,但要付出代价(除了这些缺少的功能):它更加冗长,更加复杂,并且有更多的出现用户错误的机会. 如果可能,请使用功能更友好的API.