背景
在尝试机器学习时,我经常通过 pickling/unpickling 的方式重用之前训练过的模型。
然而,在进行特征提取部分时,不混淆不同的模型是一个挑战。
因此,我想添加一项检查,以确保使用与测试数据完全相同的特征提取过程来训练模型。
Problem
我的想法如下:
除了模型之外,我还会在 pickle 转储中包含一个哈希值,该值对特征提取过程进行指纹识别。
当训练模型或使用它进行预测/测试时,模型包装器会被赋予符合特定协议的特征提取类。
使用hash()
当然,在该类上是行不通的,因为它在调用之间并不持久。
所以我想我也许可以找到定义该类的源文件,并从该文件中获取哈希值。
然而,可能有一种方法可以直接从类的内存内容中获取稳定的哈希值。
这样做有两个好处:
如果找不到源文件,它也可以工作。
它可能会忽略对源文件的不相关更改(例如修复模块文档字符串中的拼写错误)。
类是否有可以在此处使用的代码对象?
您所寻找的只是一个哈希过程,其中包含类定义的所有重要细节。 (可以通过包含来包含基类their递归地定义。)为了最大限度地减少错误匹配,基本思想是将宽(加密)散列应用于序列化你们班的。所以从pickle
:它支持的类型比hash
并且,当它使用身份时,它使用可重现的基于名字的身份。这使得它成为递归策略基本情况的良好候选者:处理其函数和类contents很重要并让它处理引用的任何辅助对象。
因此按案例定义序列化。调用一个对象special如果它属于除最后一种情况之外的任何一种情况。
- For a
tuple
deemed to contain special objects:
- 人物
t
- 其系列化
len
- 每个元素按顺序序列化
- For a
dict
deemed to contain special objects:
- 人物
d
- 其系列化
len
- 每个名称和值的序列化,按排序顺序
- For a class whose definition is salient:
- 人物
C
- 其系列化
__bases__
- 其系列化
vars
- For a function whose definition is salient:
- 人物
f
- 其系列化
__defaults__
- 其系列化
__kwdefaults__
(在 Python 3 中)
- 其系列化
__closure__
(但与细胞values而不是细胞本身)
- 其系列化
vars
- 其系列化
__code__
- For a code object (since
pickle
doesn’t support them at all):
- 人物
c
- 其系列化
co_argcount
, co_nlocals
, co_flags
, co_code
, co_consts
, co_names
, co_freevars
, and co_cellvars
, 以该顺序;这些都不是特别的
- For a static or class method object:
- 人物
s
or m
- 其系列化
__func__
- For a property:
- 人物
p
- 其系列化
fget
, fset
, and fdel
, 以该顺序
- 对于任何其他对象:
pickle.dumps(x,-1)
(你实际上从未store所有这一切:只需创建一个hashlib
您在顶级函数和递归部分中选择的对象update
它依次与序列化的每个部分一起。)
类型标签是为了避免冲突,特别是没有前缀。二进制 pickles 已经没有前缀了。您可以根据对其内容的确定性分析(即使是启发式的)或上下文来做出有关容器的决策,只要保持一致即可。
与往常一样,平衡误报和误报是一门艺术:对于一个函数,您可以包括__globals__
(修剪已经序列化的对象以避免大的(如果不是无限的)序列化)或只是任何__name__
其中发现。省略co_varnames
忽略重命名局部变量,除非内省很重要,否则这很好;同样对于co_filename
and co_name
.
您可能需要支持更多类型:查找不支持的静态属性和默认参数pickle
正确地(因为他们contain对特殊类型的引用)或根本没有。当然请注意,某些类型(例如文件对象)是不可picklable的because序列化它们很困难或不可能(尽管与pickle
完成后,您可以像处理任何其他函数一样处理 lambdacode
对象)。存在一些错误匹配的风险,您可以选择仅序列化type此类对象(一如既往,以字符为前缀?
以区别于该位置实际具有的类型)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)