tf.keras.models.clone_model克隆模型时是否应保留对象哈希值?
Keras模型克隆后哈希值不一致的原因
Python中未自定义__hash__方法的类实例,调用内置hash()时的计算依据是对象的内存地址,和对象本身存储的内容、属性没有关系,这是克隆后哈希值不相等的核心原因。
tf.keras.models.clone_model()生成的是完全独立的新模型实例,哪怕和原模型的网络结构、初始权重完全一致,也会被分配独立的内存空间,属于两个不同的Python对象,哈希值自然不会相等。- 只有两个变量指向同一个内存地址的对象(可通过
model is target_model返回True判断)时,二者的默认哈希值才会一致。哪怕两个对象内容100%相同,只要内存地址不同,默认哈希就会不同。 - 深度Q网络训练场景下,不要用
hash()校验模型克隆的一致性。正确的校验方式是对比模型结构配置、逐元素对比权重张量数值,示例代码如下:
# 逐元素对比两个模型的所有权重是否完全相等 weight_match = tf.nest.map_structure( lambda w1, w2: tf.reduce_all(tf.equal(w1, w2)), model.weights, target_model.weights ) all_weight_equal = all(weight_match)
提示:所有未重写
__hash__方法的Python对象都遵循这个哈希规则,不止TensorFlow Keras模型,PyTorch模型、普通自定义类实例都是如此。如果需要基于模型内容生成可对比的哈希值,需要先序列化模型的结构和权重,再对序列化后的二进制内容计算哈希。
内容的提问来源于stack exchange,提问作者Della
相关产品推荐
相关产品推荐

