.pth

.pth文件是PyTorch模型的一种保存格式,其中包含了模型的权重、偏差、优化器状态字典等参数信息,这些信息存储在一个 Python 字典对象中,称为 state_dict。state_dict 包含了模型的所有可学习参数。要创建和使用.pth文件,需要创建一个文本文件,以.pth为扩展名,每一行指定一个要添加到搜索路径的目录。

函数的使用

  • torch.save()

在pytorch中,使用torch.save()函数将模型或模型参数保存到pth文件中

  • torch.load()

使用torch.load()函数来加载保存好的模型或模型参数

  • load_state_dict()

通过torch.load()函数得到第一个模型对象,这个对象与保存时的状态是完全一致的。如果只加载了模型的参数,我们需要先将这些参数加载到一个新的模型实例中,这通常是通过调用模型的load_state_dict()方法来实现的。

来道题理解一下

以iscc中神经网络一题为例子
首先拿到machmennt.pth文件
先让ai写个脚本拿到参数信息

import torch
# 加载模型文件
state_dict = torch.load("attachment-38.pth", map_location='cpu')
# 如果是字典,打印一些键值
if isinstance(state_dict, dict):
    print(state_dict.keys())

上述脚本可能需要对字典和键值有些了解,简单来说,字典可以理解为一种存储键值对的数据结构,而键是用来访问每个对应值的标签。
然后我们可以得到
state_dict(['fc1.weight', 'fc1.bias', 'secret_key.weight', 'fc_secret.weight', 'output.weight', 'output.bias'])

import torch
# 读取模型参数文件
state_dict = torch.load("C:\\Users\\Lenovo\\Downloads\\attachment-38(1).pth", map_location='cpu')
# 遍历所有参数,输出参数名和对应的尺寸
for key, value in state_dict.items():
    print(f"{key}: {value.shape}")
    # 如果你只想要尺寸信息,也可以,只显示尺寸
    # print(f"{key}: {value.shape[0]}×{value.shape[1]}")

可以得到结果
fc1.weight: torch.Size([16, 16])
fc1.bias: torch.Size([16])
secret_key.weight: torch.Size([4, 16])
fc_secret.weight: torch.Size([4, 16])
output.weight: torch.Size([4, 4])
output.bias: torch.Size([4])
注意这里的两个[4,16]出现了问题

  • 正常前馈层结构应是:

每一层的参数尺寸:
权重:[上一层输出维度, 当前层输入维度]
偏置:[当前层输出维度]
输入和输出匹配示例:
第一层(假设输入为特征向量,长度为 16):
权重: [16, 16]
输入: [16]
输出: [16]
第二层(假设接收第一个层的输出,长度也是16):
权重: [16, 4] (输入4,输出16)
输入: [4]
输出: [16]
所以明显这两个secret出现了差错
猜测是隐藏了某些信息
查看一下里面藏了什么

import torch
# 加载模型参数
sd = torch.load("C:\\Users\\Lenovo\\Downloads\\attachment-38(1).pth", map_location='cpu')
# 提取参数
secret_key_weight = sd['secret_key.weight'].flatten()
fc_secret_weight = sd['fc_secret.weight'].flatten()
# 转成字节数组
bytes_secret_key = bytes(int(x) & 0xFF for x in secret_key_weight)
bytes_fc_secret = bytes(int(x) & 0xFF for x in fc_secret_weight)
# 打印字节内容
print("secret_key.weight 字节内容:" ,bytes_secret_key)
print("\nfc_secret.weight 字节内容:",bytes_fc_secret.decode('utf-8'))

得到secret_key.weight 字节内容: b"2025/\xeb\x82AT[/\xbfl<\xe2\x13K5\xe5'ISCC\x86\x95\n\xd5>T\xa1\xd7R\xf5\xb9;^y\xb8+2025&\x9fD<\x80\xc8\x15\x1f\x04\x9c_C\x9d+|\xa9KEY!"
fc_secret.weight 字节内容: 缩小255倍   放大255倍
这里用到的是后面的提示 要到output里去找缩放数据
根据上述键值判断没有激活函数 这意味着模型只是在做纯线性变换,输出完全受权重和偏置影响
输出:y=Wx+b 其中,W 是权重矩阵,b 是偏置。
secret_key、fc_secret 都没有 bias,output 用了 bias,把输出从0变成偏置的值。
偏置(bias)在没有输入信息(全0)时,能决定模型的基准输出
输入全0,线性层没有bias,输出全部0;最后一层有bias,所以输出就是那个bias的值。
所以接下来我们把输入设 0 向量,所有权重乘以 0 后只剩最后一层 bias

import torch
# 加载模型参数
sd = torch.load("attachment-38.pth", map_location='cpu')
# 提取output.bias
bias = sd['output.bias']
# 将bias值乘以255,四舍五入,转为整数
vals = [int(torch.round(v * 255).item()) & 0xFF for v in bias]
# 转换成字节数组
core = bytes(vals)
# 输出结果
print('二进制数据:', core)

这样就可以得到最终的结果
作者总结:这纯深度学习为什么放到misc里面 这样什么都往misc里面放真的好吗 这shi也是吃上了

.pptm

PPTM文件是由Microsoft PowerPoint创建的启用宏的演示文稿文件。它用于存储与PowerPoint软件相关的数据,主要用于创建和共享商业、教育或个人演示文稿。可以使用WPS Office、PowerPoint Online或Google幻灯片免费查看和编辑PPTM文件,也可以将其转换为PDF或其他格式。

查看方式

  • 首先安装Oletools

pip install oletools

  • 运行查看宏代码

olevba xxx.bin(doc)