如何使用tf.keras.Model保存和恢复模式的权重-TensorFlow 2.0-Functional API

时间:2019-12-15 16:10:08

标签: python tensorflow machine-learning tf.keras eager-execution

在示例here中,它提到可以按如下所示对tf.keras.Model类进行子类化:

class MyModel(tf.keras.Model):

    def __init__(self):
    super(MyModel, self).__init__()
    self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
    self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)

但是,如果我要具有可变数量的层以及可变类型的层怎么办?如何将图层对象存储在类对象中?

据我所了解,我在上面的示例中为属性(dense1,dense2)赋予的名称很重要,因为在保存到检查点等时将用于引用这些层及其变量?正确吗?

我的问题基本上是:如果我不知道可用的图层数,如何将其存储在tf.keras.Model子类中?然后如何保存和恢复这些图层的权重?

我的第一个想法是拥有图层对象列表,但是对我来说,这些图层权重将如何保存和恢复并不明显,因为它们不会对应于不同的属性名称。

1 个答案:

答案 0 :(得分:1)

简短的答案是:照常做,Tensorflow负责其余的工作。

答案save_weights的{​​{1}}方法的docstring中已隐藏(已加强调):

以TensorFlow格式保存时,网络引用的所有对象都是 以与tf.keras.Model相同的格式保存,包括任何tf.train.Checkpoint 实例或分配给对象属性的Layer实例。对于 跟踪/保存使用网络使用的Optimizertf.keras.Model(inputs, outputs)实例从输入和输出构建的网络 自动。 对于继承自Layer的用户定义的类, tf.keras.Model实例必须分配给对象属性,通常是在 构造函数

完成目标的最简单方法是将图层分配给Python对象。在下面的示例中,我使用字典来保留原始名称。

Layer

这允许您以编程方式指定将更改模型属性的属性-例如对于自动超参数调整非常有用。

这是一个使用上面定义的类的完全可复制的示例:

class MyModel(tf.keras.Model):

def __init__(self):
    super(MyModel, self).__init__()
    self.my_weight_dict = {}
    self.my_weight_dict["dense1"] = tf.keras.layers.Dense(6, activation=tf.nn.relu)
    self.my_weight_dict["dense2"] = tf.keras.layers.Dense(3, activation=tf.nn.softmax) # changed to fit the dataset

def call(self,inputs):
    x = self.my_weight_dict["dense1"](inputs)
    return self.my_weight_dict["dense2"](x)