在示例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子类中?然后如何保存和恢复这些图层的权重?
我的第一个想法是拥有图层对象列表,但是对我来说,这些图层权重将如何保存和恢复并不明显,因为它们不会对应于不同的属性名称。
答案 0 :(得分:1)
简短的答案是:照常做,Tensorflow负责其余的工作。
答案save_weights
的{{1}}方法的docstring中已隐藏(已加强调):
以TensorFlow格式保存时,网络引用的所有对象都是 以与
tf.keras.Model
相同的格式保存,包括任何tf.train.Checkpoint
实例或分配给对象属性的Layer
实例。对于 跟踪/保存使用网络使用的Optimizer
,tf.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)