机器学习算法在训练过程中参数保存
2017-03-07 15:03
288 查看
本文转发自: wepon
感谢原创!
(一)、python读取 “***.pkl.gz” 文件
用到Python里的gzip以及cPickle模块,简单的使用代码如下,如果想详细了解可以参考:pickle — Python object serialization、DeepLearning Getting started
其实就是分两步,先读取 gz 文件,再读取 pkl 文件。pkl 文件的应用正是下文要讲的,我们用它来保存机器学习算法训练过程中的参数。
(二)机器学习算法在训练过程中如何保存参数?
我们知道,机器学习算法的计算量特别大,跑起程序来少则几十分钟,多则几小时甚至几天,中间如果有什么状况(比如电脑过热重启、程序出现一些小 bug…)程序就会中断,如果你没把参数定时保存下来,前面的训练就当白费了,所以很有必要在程序中加入定时保存参数的功能,这样下次训练就可以将参数初始化为上次保存下来的结果,而不是从头开始随机初始化。
那么如何保存模型参数?可以将参数复制,或者调用python的数据永久存储 cPickle 模块,原理不多说,直接使用就行。(注:python 里有 cPickle 和 pickle,cPickle 基于 c 实现,比 pickle 快。)
在 deeplearning 算法中,因为用到 GPU ,经常是将参数声明为 shared 变量,因此必须用上 get_value()、set_value,例如有w、v、u三个 shared 变量,使用代码如下:
典例:
下面我以一个实际的例子来说明如何在程序中加入保存参数的功能。以 deeplearnig.net 上的逻辑回归为例,它的代码地址:logistic_sgd.py。这个程序是将逻辑回归用于MNIST分类,程序运行过程并不会保存参数,甚至运行结束时也不保存参数。怎么做可以保存参数?
在 logistic_sgd.py 代码里最后面的 sgd_optimization_mnist() 函数里,有个 while 循环,里面有一句代码:
这句代码的意思就是判断当前的验证损失是否小于最佳的验证损失,是的话,下面会更新 best_validation_loss,也就是说当前参数下,模型比之前的有了优化,因此我们可以在这个if语句后面加入保存参数的代码:
save_params 函数定义如下:
当然参数的个数根据需要去定义。在 logistic_sgd.py 中参数只有 classifier.W,classifier.b,因此这里定义为 save_params(param1,param2)。
在 logistic_sgd.py 里我加入了 save_params(classifier.W,classifier.b),运行了3次epoch,中断掉程序,在代码所在的文件夹下,多出了一个 params 文件,我们来看看这个文件里是什么东西:
也就是说,params文件确实保存了我们训练过程中的参数。也就是说,params文件确实保存了我们训练过程中的参数。
那么如何用保存下来的参数来初始化我们的模型的参数呢?
在 logistic_sgd.py 中的 class LogisticRegression(object) 下,self.W 和 self.b 本来是初始化为0的,我们可以在下面加上几行代码,这样就可以用我们保存下来的 params 文件来初始化参数了:
感谢原创!
(一)、python读取 “***.pkl.gz” 文件
用到Python里的gzip以及cPickle模块,简单的使用代码如下,如果想详细了解可以参考:pickle — Python object serialization、DeepLearning Getting started
#以读取mnist.pkl.gz为例 import cPickle, gzip f = gzip.open('mnist.pkl.gz', 'rb') train_set, valid_set, test_set = cPickle.load(f) f.close()
其实就是分两步,先读取 gz 文件,再读取 pkl 文件。pkl 文件的应用正是下文要讲的,我们用它来保存机器学习算法训练过程中的参数。
(二)机器学习算法在训练过程中如何保存参数?
我们知道,机器学习算法的计算量特别大,跑起程序来少则几十分钟,多则几小时甚至几天,中间如果有什么状况(比如电脑过热重启、程序出现一些小 bug…)程序就会中断,如果你没把参数定时保存下来,前面的训练就当白费了,所以很有必要在程序中加入定时保存参数的功能,这样下次训练就可以将参数初始化为上次保存下来的结果,而不是从头开始随机初始化。
那么如何保存模型参数?可以将参数复制,或者调用python的数据永久存储 cPickle 模块,原理不多说,直接使用就行。(注:python 里有 cPickle 和 pickle,cPickle 基于 c 实现,比 pickle 快。)
示例:
a=[1,2,3] b={4:5,6:7} # 保存,cPickle.dump函数。/home/wepon/ab是路径,ab是保存的文件的名字 # 如果/home/wepon/下本来就有ab这个文件,将被覆写,如果没有,则创建。'wb'表示以二进 # 制可写的方式打开。dump中的-1表示使用highest protocol。 import cPickle write_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,b read_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 上的逻辑回归为例,它的代码地址:logistic_sgd.py。这个程序是将逻辑回归用于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 cPickle f=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文件确实保存了我们训练过程中的参数。也就是说,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)
相关文章推荐
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- 机器学习算法在训练过程中保存参数
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- DeepLearning tutorial(2)机器学习算法在训练过程中保存参数
- tensorflow1.1/保存和提取训练好的参数
- SVM支持向量机目标函数及参数训练过程说明解读
- 遍历数据库中的用户存储过程,获得每个存储过程的参数名、参数类型、存储过程名称等信息以xml的形式保存
- CNN反向传播训练参数过程
- cs231n-之训练过程参数监控(占个位,回来补)
- Tensorflow使用笔记(1) 怎么保存和使用训练好的参数和模型
- YOLO模型训练可视化训练过程中的中间参数
- TensorFlow 训练好模型参数的保存和恢复代码
- Convolutional Neurons Network 训练参数与连接数计算过程
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- tensorflow笔记:模型的保存与训练过程可视化
- tensorflow笔记:模型的保存与训练过程可视化
- YOLO模型训练可视化训练过程中的中间参数