博客
关于我
机器学习算法在训练过程中保存参数
阅读量:293 次
发布时间:2019-03-03

本文共 3484 字,大约阅读时间需要 11 分钟。

#机器学习算法在训练过程中保存参数

.pkl 文件可以用来保存机器学习算法训练过程中产生的参数。
##一、python读取***.pkl.gz文件
用到python里的gzip以及cPickle模块,简单的使用代码如下,如果想详细了解可以参考上面给出的链接。

#以读取mnist.pkl.gz为例import cPickle, gzipf = gzip.open('mnist.pkl.gz', 'rb')train_set, valid_set, test_set = cPickle.load(f)f.close()

其实就是分两步,先读取gz文件,再读取pkl文件。pkl文件的应用正是下文要讲的,我们用它来保存机器学习算法训练过程中的参数。

##二、机器学习算法在训练过程中如何保存参数?

我们知道,机器学习算法的计算量特别大,跑起程序来少则几十分钟,多则几小时甚至几天,中间如果有什么状况(比如电脑过热重启、程序出现一些小bug…)程序就会中断,如果你没把参数定时保存下来,前面的训练就当白费了,所以很有必要在程序中加入定时保存参数的功能,这样下次训练就可以将参数初始化为上次保存下来的结果,而不是从头开始随机初始化。

直接用一个例子来说明如何使用:

a=[1,2,3]b={4:5,6:7}#保存,cPickle.dump函数。/home/wepon/ab是路径,ab是保存的文件的名字,如果/home/wepon/下本来就有ab这个文件,将被覆写#,如果没有,则创建。'wb'表示以二进制可写的方式打开。dump中的-1表示使用highest protocol。import cPicklewrite_file=open('/home/wepon/ab','wb')cPickle.dump(a,write_file,-1)cPickle.dump(b,write_file,-1)write_file.close() #读取,cPickle.load函数。read_file=open('/home/wepon/ab','rb')a_1=cPickle.load(read_file)b_1=cPickle.load(read_file)print a,bread_file.close()

在deeplearning算法中,因为用到GPU,经常是将参数声明为shared变量,因此必须用上get_value()、set_value,例如有w、v、u三个shared变量,使用代码如下:

import cPickle#保存write_file = open('path', 'wb')  cPickle.dump(w.get_value(borrow=True), write_file, -1)  cPickle.dump(v.get_value(borrow=True), write_file, -1)  cPickle.dump(u.get_value(borrow=True), write_file, -1) write_file.close() #读取read_file = open('path')w.set_value(cPickle.load(read_file), borrow=True)v.set_value(cPickle.load(read_file), borrow=True)u.set_value(cPickle.load(read_file), borrow=True)read_file.close()

一个实例

下面我以一个实际的例子来说明如何在程序中加入保存参数的功能。以deeplearnig.net上的逻辑回归为例,它的代码地址:。这个程序是将逻辑回归用于MNIST分类,程序运行过程并不会保存参数,甚至运行结束时也不保存参数。怎么做可以保存参数?
在logistic_sgd.py代码里最后面的sgd_optimization_mnist()函数里,有个while循环,里面有一句代码:

if this_validation_loss < best_validation_loss:

这句代码的意思就是判断当前的验证损失是否小于最佳的验证损失,是的话,下面会更新best_validation_loss,也就是说当前参数下,模型比之前的有了优化,因此我们可以在这个if语句后面加入保存参数的代码:

save_params(classifier.W,classifier.b)

save_params函数定义如下:

def save_params(param1,param2):    import cPickle    write_file = open('params', 'wb')     cPickle.dump(param1.get_value(borrow=True), write_file, -1)    cPickle.dump(param2.get_value(borrow=True), write_file, -1)    write_file.close()

当然参数的个数根据需要去定义。在logistic_sgd.py中参数只有classifier.W,classifier.b,因此这里定义为save_params(param1,param2)。

在logistic_sgd.py里我加入了save_params(classifier.W,classifier.b),运行了3次epoch,中断掉程序,在代码所在的文件夹下,多出了一个params文件,我们来看看这个文件里是什么东西:

import cPicklef=open('params')w=cPickle.load(f)b=cPickle.load(f) #w大小是(n_in,n_out),b大小时(n_out,),b的值如下,因为MINST有10个类别,n_out=10,下面正是10个数array([-0.0888151 ,  0.16875755, -0.03238435, -0.06493175,  0.05245609,        0.1754718 , -0.0155049 ,  0.11216578, -0.26740651, -0.03980861])

也就是说,params文件确实保存了我们训练过程中的参数。

那么如何用保存下来的参数来初始化我们的模型的参数呢?

在logistic_sgd.py中的class LogisticRegression(object)下,self.W和self.b本来是初始化为0的,我们可以在下面加上几行代码,这样就可以用我们保存下来的params文件来初始化参数了:

class LogisticRegression(object):    def __init__(self, input, n_in, n_out):        self.W = theano.shared(            value=numpy.zeros(                (n_in, n_out),                dtype=theano.config.floatX            ),            name='W',            borrow=True        )        self.b = theano.shared(            value=numpy.zeros(                (n_out,),                dtype=theano.config.floatX            ),            name='b',            borrow=True        )#!!!#加入的代码在这里,程序运行到这里将会判断当前路径下有没有params文件,有的话就拿来初始化W和b    if os.path.exists('params'):        f=open('params')        self.W.set_value(cPickle.load(f), borrow=True)        self.b.set_value(cPickle.load(f), borrow=True)

转载地址:http://jtgl.baihongyu.com/

你可能感兴趣的文章
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>