zoukankan      html  css  js  c++  java
  • Theano2.1.8-基础知识之装载和保存

    来自: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


  • 相关阅读:
    url_encode and url_decode in Shell
    学嵌入式技术,做高端电子工程师
    MCU助推居家移动医疗微型化
    深圳单片机培训,7月盛大开班,报名既送
    中国嵌入式工控机市场前景广阔
    嵌入式 现已发展为 IT行业的主流——高薪,且人才缺乏
    谷歌苹果已“技穷”?移动操作系统2013无创新
    C# 与 C++,语法差别有多小-其他2
    link
    C# 与 C++,语法差别有多小-第三章 C++数据类型 第一部分
  • 原文地址:https://www.cnblogs.com/shouhuxianjian/p/4590228.html
Copyright © 2011-2022 走看看