get_layer_and_variable_from tf.keras.Model
def get_layers_and_variables_from_model(model: tf.keras.Model, scope_name=None):
layer_dict = {}
if scope_name is not None:
base_name = scope_name
else:
base_name = model.name
# get Layers
for layer in model.layers:
if isinstance(layer, tf.keras.Model):
sub_model_layer_dict = get_layers_and_variables_from_model(
layer, "{}/{}".format(base_name, layer.name)
)
layer_dict.update(sub_model_layer_dict)
elif isinstance(layer, tf.keras.layers.Layer):
layer_dict["{}/{}".format(base_name, layer.name)] = layer
# get Variables
for attr_name, attr_value in model.__dict__.items():
# NOTE: _train_counter, _test_counter, _predict_counter are
# built-in variables of tf.keras.Model
if attr_name not in [
"_train_counter",
"_test_counter",
"_predict_counter",
] and isinstance(attr_value, tf.Variable):
layer_dict["{}/{}".format(base_name, attr_value.name)] = attr_value
return layer_dict
递归:因为keras.Model中可能包含另一个keras.Model
版本:tf2.5.1
-----2022.10.08补充------
这个方法有一个问题:如果定义keras.Model的时候,名字是相同的(或者不命名,默认名字则全部是Variable(名字不会自动unique,有可能是tf2中的eager模式认为tensor name不重要了)),例如:
self.v = tf.Variable(0.6, trainable=False, name="aaa") self.v1 = tf.Variable(0.6, trainable=False, name="aaa") self.v2 = tf.Variable(0.6, trainable=True, name="aaa")
这种情况使用上面的函数将无法区分不同的"aaa",所以使用的时候要求给Variable手动设置unique的name.
------2022.10.31补充-------
如果把Variable存到了某个dict(成员变量),上面的代码获取Variable会有问题,attr_value会是一个dict而不是Variable. 需要进一步从dict中抽出Variable

浙公网安备 33010602011771号