为何结构相同的TensorFlow/Keras模型权重文件大小不同?
存储精度不同:这是最常见的情况——同事的模型权重可能用了半精度(
float16/bfloat16)存储,而你的是单精度(float32)。半精度每个参数占2字节,单精度占4字节,刚好文件大小差一倍。而且加载后再保存如果没修改存储精度,大小会保持原样。哪怕训练时用的是相同精度,保存时指定不同格式就会出现这个差异。是否包含优化器状态:如果你的模型保存时连带存了优化器的状态(比如Adam的动量、累积梯度这些参数),而同事的只存了模型本身的权重,文件大小也会差一倍——因为优化器状态的参数数量通常和模型可训练参数一致。比如PyTorch里
torch.save(model.state_dict())只存模型权重,而torch.save({'model': model.state_dict(), 'optimizer': opt.state_dict()})会多存一份优化器数据。训练细节导致性能差距:结构相同不代表训练效果一致。初始权重的分布、学习率调度、batch size、数据增强的力度、正则化(dropout/L2)的设置,甚至训练数据的划分和质量,都会极大影响最终模型的性能。哪怕参数数量一样,这些细节的差异会让权重的数值分布完全不同,效果自然差很多。
冗余元数据或存储格式差异:部分框架在保存模型时,会附带一些额外的元数据(比如计算图、模型构建的历史信息),或者不同的存储格式(比如TensorFlow的SavedModel和H5格式)也会导致大小差异,但这种情况通常不会刚好差一半,更多是小幅度的区别,可以检查下双方的保存命令是否一致。
内容的提问来源于stack exchange,提问作者nopskazoid

