来自:http://deeplearning.net/software/theano/tutorial/loading_and_saving.html

loading and saving

Python的标准方式来保存类实例和装载的方式是 pickle 机制。许多theano对象可以被pickle序列化(和反序列化)。然而,pickles的限制是它没法当类实例被序列化的时候,保存类的代码或者数据。所以,重新装载之前的类创建的对象变得非常有问题。

所以,你想要使用另一个不同的机制,这取决于你在保存和重新装载之间间隔的时间的大小。对于短期来说(例如临时文件或者网络迁移),将theano的对象或者类进行pickling是可能的。对于长期来说 (例如从一个试验中保存模型) ,就不要依赖于 pickled Theano对象了;我们推荐在其他python的程序过程中装载和保存这个底层的共享变量。

一、pickling的基础

两个模块 pickle 和 cPickle 有着相同的功能,不过 cPickle 是c实现的,可以更快:

>>> import cPickle

你可以使用cPickle.dump来将对象序列化到文件中(save,或pickle):

>>> f = file('obj.save', 'wb')
>>> cPickle.dump(my_obj, f, protocol=cPickle.HIGHEST_PROTOCOL)
>>> f.close()

note:如果你想要你保存的对象能够高效的存储起来,不要忘记使用cPickle.HIGHEST_PROTOCOL.
生成的结果文件可能比默认的协议要小上20几倍。

note:用二进制模式打开你的文件 ('b')
有助于移植 (特别是在Unix和Windows之间)。

为了反序列化 (或者 load,
或者 unpickle)一个
pickled 文件,使用 cPickle.load:

>>> f = file('obj.save', 'rb')
>>> loaded_obj = cPickle.load(f)
>>> f.close()

你可以将好几个对象pickle到同一个文件中,然后将它们都进行装载 (以相同的顺序):

>>> f = file('objects.save', 'wb')
>>> for obj in [obj1, obj2, obj3]:
>>> cPickle.dump(obj, f, protocol=cPickle.HIGHEST_PROTOCOL)
>>> f.close()

然后:

>>> f = file('objects.save', 'rb')
>>> loaded_objects = []
>>> for i in range(3):
>>> loaded_objects.append(cPickle.load(f))
>>> f.close()

更详细的
pickle用法,查看 Python
documentation
.

二、短时间序列化

如果你很自信的说,你序列化的类实力可以被代码的一个兼容版本所反序列化,那么pickling整个模型是一个很好的方法,例如,如果你在你程序的同一次执行中保存模型然后重新装载,或者你保存的类已经稳定了一会儿了。

你可以控制从你的对象中什么 pickle需要被save。通过定义一个 __getstate__ 方法,和一个相似的__setstate__方法。

这是特别有用的,如果你的模型类包含了对一个当前使用的数据集的链接,那么你可能不想要pickle你的模型的每个实例。

例如,你可以定义有双下划线的函数:

def __getstate__(self):
state = dict(self.__dict__)
del state['training_set']
return state def __setstate__(self, d):
self.__dict__.update(d)
self.training_set = cPickle.load(file(self.training_set_file, 'rb'))

三、鲁棒性的序列化

这种序列化使用了一些特定于theano的帮助函数。它使用python的pickling协议来序列化对象,不过包含在任何对象内的 ndarray 或者 CudaNdarray 对象都被一NPY文件分别独立保存了。这些NPY文件和Pickled的文件都放在一个ZIP文件内。

这个方法的主要优势在于你升职不需要安装theano,就能看到你pickled的共享变量的值。你可以只是通过手动用numpy来装载这些参数就好。

numpy.load('model.zip')

该方法当你和那些没有安装theano的人共享你的模型的时候,或者那些人使用着不同的python版本,或者你计划长时间保存你的模型,这些情况下是很受益的。(在这种情况下错误的匹配会使得unpickle对象变得很快困难).

见 theano.misc.pkl_utils.dump() 和 theano.misc.pkl_utils.load()。

四、长时间序列化

如果你想要保存的类的实现是不稳定的,例如当函数被创建或者移除,类成员被重命名,你就应该只保存和装载你类的稳定不变的那部分。

你可以通过定义 __getstate__ 和 __setstate__ 函数来达到目的,应该定义你想要保存的属性,而不是那些你不需要保存的。

例如,如果这个唯一你想要保存的参数是权重矩阵W 和偏置 b,那么就可以定义:

def __getstate__(self):
return (self.W, self.b) def __setstate__(self, state):
W, b = state
self.W = W
self.b = b

如果在某个时间点上,W 重命名成了权重,而b成了偏置,那么更老的pickled文件就变得没法用了:

def __getstate__(self):
return (self.weights, self.bias) def __setstate__(self, state):
W, b = state
self.weights = W
self.bias = b

更多有关使用pickle的高级用法和它的内部信息,参考Python的 pickle 文档。

参考资料:

[1] 官网:http://deeplearning.net/software/theano/tutorial/loading_and_saving.html

Theano2.1.8-基础知识之装载和保存的更多相关文章

  1. 【干货】用大白话聊聊JavaSE — ArrayList 深入剖析和Java基础知识详解(二)

    在上一节中,我们简单阐述了Java的一些基础知识,比如多态,接口的实现等. 然后,演示了ArrayList的几个基本方法. ArrayList是一个集合框架,它的底层其实就是一个数组,这一点,官方文档 ...

  2. Oracle数据库基础知识

    oracle数据库plsql developer   目录(?)[-] 一     SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...

  3. Android中的一些基础知识(三)

    最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...

  4. 【OGG】OGG基础知识整理

    [OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...

  5. 学习Spring必学的Java基础知识(1)----反射(转)

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  6. 学习Spring必学的Java基础知识(1)----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  7. PHP基础入门(五)---PHP面向对象实用基础知识

    前言: 今天来和大家介绍一下PHP的面向对象.说到面向对象,我不得不提一下面向过程,因为本人在初学时,常常分不清楚面向对象和面向过程,下面就来给大家介绍一下它们的区别: 面向对象专注于由哪个对象来处理 ...

  8. 20155306 白皎 0day漏洞——基础知识

    20155306 白皎 0day漏洞--(第一篇)基础知识 写在前面: 本次免考实践方向是0day漏洞,以博客的形式记录了我的学习实践过程.第一篇博客主要围绕什么是0day漏洞以及一些以后学习中需要的 ...

  9. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

随机推荐

  1. Java Dom解析的三个实例

    概述 Dom解析的文章已经烂大街了.在这里,只举三个场景下如何编码的例子: xml内有多个同名节点,获取这多个同名节点 已获取到某个节点,生成这个节点的xml描述 修改节点某属性的值 详细的讲解看官请 ...

  2. 烂泥:linux文件同步之rsync学习(一)

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天刚好有空就打算开始学习linux下的文件同步软件rsync,在学习rsync时,我们可以分以下几个步骤进行: 1. rsync是什么 2. rsy ...

  3. Linux IPC System V 共享内存

    模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...

  4. C 运算符优先级

    优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右   () 圆括号 (表达式)/函数名(形参表)   . 成员选择(对象) 对象.成员名   -& ...

  5. [译] libvirt 虚机的生命周期 (Libvirt Virtual Machine Lifecycle)

    翻译自:http://wiki.libvirt.org/page/VM_lifecycle   这篇文章描述虚机生命周期的基本概念.其目的在于在一篇文章中提供完整的关于虚机创建.运行.停止.迁移和删除 ...

  6. Windows Azure支持七层负载均衡--Application Gateway

    一直以来Windows Azure的负载均衡(Loadbalancer)功能一直被客户诟病,无法其竞争对手(特别是国内的云厂商)匹敌. Windows Azure的负载均衡器是四层的,前期的版本不支持 ...

  7. 安装rpm包

    下载好一个rpm包怎样安装? [root@localhost ~]# ls anaconda-ks.cfg install.log install.log.syslog jboss-as-7.1.1- ...

  8. 【原】常见CSS3属性对ios&android&winphone的支持

    2个月前,我在博文<webapp开发中兼容Android4.0以下版本的css hack>中写过“那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了” ,在 ...

  9. java使用IO读写文件总结

    每次用到IO的读写文件都老忘记写法,都要翻过往笔记,今天总结下,省的以后老忘.java读写文件的IO流分两大类,字节流和字符流,基类分别是字符:Reader和Writer:字节:InputStream ...

  10. 【CSS】使用CSS选择器(第二部分)

    1. 使用结构性伪类选择器 使用结构性伪类选择器能够根据元素在文档中的位置选择元素.这类选择器都有一个冒号字符前缀(:),例如 :empty .它们可以单独使用,也可以跟其他选择器组合使用,如: p: ...