因为需要将pth参数搞出来,但是模型生成的权重文件无法直接打开,(txt、pycharm打开均乱码)。根据广大csdn大佬支招分享,本人使用以下代码代码来读取网络层和相关参数,总结如下:
1.终端可视版本:pycharm一键运行
存在问题:模型参数多了显示不全
2.txt版本:
import torch
pthfile = r'./openpose_vgg_quant.pth' # .pth文件的路径
model = torch.load(pthfile) # 设置在cpu环境下查询
# 打开一个文件用于写入
with open('weight.txt', 'w') as f:
# 写入模型类型和长度
f.write('type:\n')
f.write(str(type(model)) + '\n')
f.write('length:\n')
f.write(str(len(model)) + '\n\n')
# 写入模型字典的key
f.write('key:\n')
for k in model.keys():
f.write(k + '\n')
f.write('\n')
# 写入模型字典的value
f.write('value:\n')
for k in model:
# 将键和值转换为字符串,并写入文件
# 使用repr函数可以获取值的准确表示,适合于复杂的数据结构
f.write(k + ': ' + repr(model[k]) + '\n')
ps:这个代码仅保证全部存入txt,格式还需微调才可匹配,今天用的网络参数太多了,明天换个小点的网络在调整一下。2024.5.13~打卡下班撤退!
5.14新的一天记录:
import torch
path = './openpose_vgg_quant.pth'
pretrained_dict = torch.load(path)
##########################列出所有的参数名称及其尺寸######################
for key, value in pretrained_dict.items():
print(key, value.size())
##########################列出所有的参数名称及其尺寸######################
每层四个参数,权重、偏置,缩放因子、零点
新的一天新的问题!!!!为什么我量化后的参数还是float呜呜呜T_T
怎么办怎么办怎么办怎么周二就想摸鱼了呜呜呜
今天也是不想学习的 一天T_T想回宿舍躺着玩呜呜呜
太神奇了!天奔流阴阴的,突然太阳出现了金碧辉煌的,后面还有火烧云!太美好了上图
5.14晚思考:明天trytry能不能只提取weight跟bias,之前搜到过单纯print model参,但是我的应用不了。
515思路:先把.pth的tensor数据搞出来,然后给他们做成一行一个数形式
今天是小白搞代码
f.write(f"Key: {key}\n") # 写入键名码片
# f 前缀表明这是一个格式化字符串字面量。
# {key} 是一个表达式,它会被替换为变量 key 的当前值。在这个上下文中,key 可能是一个表示模型参数名称的字符串,如 "model0.0.weight" 或 "model0.0.bias"。
# \\n 是一个转义序列,代表一个换行符。在字符串中使用它会导致字符串输出后进行换行
515晚总结:今天只把bias(因为他是float32可以用value.tolist())一行一个输出出来了,但是量化后的权重是int8类型,不可以使用这个函数,应该是数据类型不匹配。明天搞!
5.16 Python的str()函数
坏处:str()函数默认会尝试提供一个简洁的、可读的表示,而不是显示对象的全部内容,尤其是当对象的内容非常长时。在你提供的代码片段中,当你尝试将张量对象v转换为字符串并写入文件时,如果张量非常大,str(v)可能会返回一个使用省略号的简化表示,而不是张量的完整内容。这就是为什么在生成的output.txt文件中,一些数据被省略号替代的原因。
repr()函数:它会提供张量的准确字符串表示,包括其完整内容。不过,这可能会导致生成的文本文非常大,且内容难以阅读。此外,对于非常大的张量,即使是repr()也可能无法完整显示所有数据。