计算图的实现
pensieve的Python项目详细描述
养老金2.1
“一个人只是从自己的头脑中吸取多余的思想,把它们倒进盆里,然后在闲暇时检查它们。当模式和链接以这种形式出现时,就更容易发现它们。“
-albus邓布利多(哈利波特与火焰杯作者j.k.罗琳)
数据
在J. K. Rowling神奇的魔法世界里, “巫婆或巫师可以提取他们自己或他人的记忆,将它们存储在Pensieve, 然后review稍后再查看。它还可以relieve the mind当信息变得杂乱无章时。 任何人都可以examine检查养老金中的记忆,这也让观众完全沉浸在 他们在记忆中。
在数据科学中,在数据争用和模型生成过程中处理数据就像处理内存一样。 除了在处理数据时有更多的来回和迭代。 你不断地更新模型的参数,改善你的数据争论, 并更改可视化或存储数据的方式。 与数据科学中的大多数过程一样,一路上的每一步都可能需要很长时间才能完成 这迫使您避免从头开始重新运行所有内容;这种方法很容易出错 过程依赖于其他过程。为了解决这个问题,我想出了一个计算图 其中节点表示数据对象,边的方向表示它们之间的依赖关系。
在我自己使用了一段时间后,我发现它在以下几个方面是有益的:
- 减少错误,特别是在数据争用和模型创建时
- 数据对象组织
- 轻松传输数据
- 相干数据处理和数据管道
- 数据和模型再现性
- 最重要的是放松身心
安装
pip install pensieve
用法
pensieve存储定义内存之间关系的memories和functions函数。
frompensieveimportPensieve# initiate a pensievepensieve=Pensieve()# store a "memory" (with 1 as its content) pensieve.store(key='one',content=1)# create a new memory made up of a precursor memorypensieve.store(key='two',precursors=['one'],function=lambdax:x+x)
有两种类型的记忆:
- 独立的记忆(无前驱)
- 依赖性记忆(有前驱体)
独立记忆
一个独立的记忆没有任何先兆,而不是一个功能, 它将定义与前体的关系,具有content。
frompensieveimportPensievepensieve=Pensieve()pensieve.store(key='integers',content=list(range(10)))
依赖性记忆
从对的内容运行函数创建依赖内存 它的前体。当内存只有一个前兆时,函数可以是 定义为一个lambda,其中一个输入直接在函数中访问, 例如,lambda x:x+1。
# the precursor, 'integer' is accessed within the lambda under the label: numberspensieve.store(key='odd_integers',precursors=['integers'],function=lambdanumbers:[xforxinnumbersifx%2==1])
具有两个或多个{em1}$前体的内存
如果一个存储器有多个前驱,它的功能应该仍然有一个输入,但是 前体应该作为输入项访问,就像输入是字典一样 前体的。
例如,如果一个函数添加了两个前体x和y,则应将其定义为: lambda x:x['x']+x['y']。在下面的示例中,函数获取一组整数和 奇数整数,通过从整数中过滤出奇数整数,它可以找到所有的偶数整数 在片场。此函数只有一个输入,为清楚起见,称为precetors。 (但可以称为任何东西)并且前体在函数中作为 项目'integers'和'odd_integers'就像字典一样。
pensieve.store(key='even_integers',precursors=['integers','odd_integers'],function=lambdaprecursors:[xforxinprecursors['integers']ifxnotinprecursors['odd_integers']])
检索内存
检索内存内容就像从字典中获取项,如下所示。
pensieve['integers']# output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]pensieve['even_integers']# output: [0, 2, 4, 6, 8]
更改内存
当您在Pensive中更改内存时,所有successiver都会得到通知并标记为stale,但不会立即更新。 一旦需要一个已更改内存的继承者,它将根据与它的关系进行更新 前驱记忆。
# changing one memory affects all successorspensieve.store(key='integers',content=list(range(16)))pensieve['integers']# output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]pensieve['even_integers']# output: [0, 2, 4, 6, 8, 10, 12, 14]