python中对象序列化及tensorflow的命令行参数解析

来源:互联网 发布:淘宝古董钟表 编辑:程序博客网 时间:2024/06/11 22:02

2017年9月17日
MIL day ?
注: 该篇文章同样post到我个人博客网站上,传送门
虽然这两天状态有些差,但是断断续续的看代码还是学到了一点东西,关于python中经常用到的对象序列化反序列化以及文件的读写操作;关于tensorflow中flags.py对命令行参数解析;以及对ubuntu系统安装的psensorCPU/GPU温度监控做一个总结,这种学到新东西的感觉真是圆满啊

序列化与反序列化

做分类分割模型的训练时,都不可能通过一张张图片训练集直接操作的,大部分情况下是对图片的灰度值进行操作;灰度值数据存入文件中,我们不可能单纯通过file.read() 或者file.readline()读取,很慢还麻烦;更多时候,我们是通过cPickle.load()将文件数据反序列化后存入对象,然后对对象(list或者tuple或者dict)进行切片操作选取部分数据或者其他操作,这样大大提高速度。
同样,当有些参数如weight/bias等需要保留至磁盘时,同样可以通过cPickle.dump()将数据对象序列化后存入文件。
具体示例如下:

"""以下为将data对象序列化后存入test.txt文件""">>> import cPickle as cp # 导入cPickle模块>>> import numpy as np # 导入numpy模块>>> data = np.random.randn(2,4,4,3) # 随机初始化一个[2,4,4,3]的正态分布,可以当作是两张4*4像素的3 channels 图片的灰度值>>> data # 显示该矩阵数据array([[[[-0.11245588,  0.46361267, -0.45861576],         [ 1.08045987, -0.0912301 ,  1.8826123 ],         [-0.51326317, -1.2739741 ,  0.96748474],         [ 1.5503973 ,  0.06333209,  0.89981012]],        [[ 0.29903728,  1.9080101 , -1.06983402],         [-0.9695859 , -1.47038233,  0.95528392],         [-1.02076298,  1.28100534,  0.48845259],         [ 1.04841292, -0.01142226,  0.10188068]],        [[ 0.3883587 ,  0.37042073, -0.0289424 ],         [ 0.53593898,  1.71126688,  0.1262282 ],         [ 0.92322512,  0.24725783,  0.8679894 ],         [-0.36954911,  0.74044357, -0.44616424]],        [[ 0.91045428, -0.24680013, -0.83070879],         [-0.34094366,  1.7384725 , -0.33322178],         [-0.75691129, -0.55346692, -0.06621144],         [-0.18568211, -0.90673854,  0.25074295]]],       [[[ 0.9069235 ,  0.60922932, -0.29551031],         [-1.34363931,  0.57989501,  0.18441912],         [-0.29126267, -0.28990356,  0.68273307],         [-0.13870684, -0.453214  ,  1.02924452]],        [[ 1.03025589, -0.20542393,  0.71855423],         [-0.40312111, -0.09586122,  0.00740302],         [ 0.54204646,  1.07633607, -0.23386144],         [ 0.06289798,  0.02128197, -1.15631823]],        [[ 1.12197064, -0.18423948, -0.61632741],         [-1.38417149, -1.70282593,  0.42730971],         [ 0.52566924,  0.24153171,  0.60613443],         [-1.12691221, -1.67107417, -1.52135605]],        [[-2.31999217, -0.57238608, -0.66098013],         [ 1.72764717, -1.89471904,  0.36895925],         [-1.67735118,  0.6438323 , -1.73313038],         [-1.00737721, -0.60583479,  2.15804428]]]])>>> file = open('./test.txt','wb') # 以二进制只写方式打开根目录下的test.txt文件,如果没有则创建一个test.txt文件>>> cp.dump(data,file) # 调用cPickle中的dump()函数,将data序列化后传入test.txt文件>>> file.close() # 数据写完后,关闭文件 

经过上述操作后,根目录下出现一个test.txt文件,打开文件如下图2所示,由于以二进制方式写,所以通过文本方式打开为乱码;实际上,反序列化后查看对象,数据不会有任何问题
这里写图片描述
图1 为在根目录创建的test.txt文件
这里写图片描述图2 为打开test.txt文件后显示内容

"""以下为将文件中数据反序列化后存入对象并查看数据""">>> FILE = open('./test.txt','rb') # 以二进制只读方式打开根目录下的test.txt文件>>> DATA = cp.load(FILE) # 调用cPickle的load函数反序列化test.txt文件中数据送入DATA对象>>> FILE.close() #文件用完后,记得关闭>>> DATA # 查看DATA对象数据array([[[[-0.11245588,  0.46361267, -0.45861576],         [ 1.08045987, -0.0912301 ,  1.8826123 ],         [-0.51326317, -1.2739741 ,  0.96748474],         [ 1.5503973 ,  0.06333209,  0.89981012]],        [[ 0.29903728,  1.9080101 , -1.06983402],         [-0.9695859 , -1.47038233,  0.95528392],         [-1.02076298,  1.28100534,  0.48845259],         [ 1.04841292, -0.01142226,  0.10188068]],        [[ 0.3883587 ,  0.37042073, -0.0289424 ],         [ 0.53593898,  1.71126688,  0.1262282 ],         [ 0.92322512,  0.24725783,  0.8679894 ],         [-0.36954911,  0.74044357, -0.44616424]],        [[ 0.91045428, -0.24680013, -0.83070879],         [-0.34094366,  1.7384725 , -0.33322178],         [-0.75691129, -0.55346692, -0.06621144],         [-0.18568211, -0.90673854,  0.25074295]]],       [[[ 0.9069235 ,  0.60922932, -0.29551031],         [-1.34363931,  0.57989501,  0.18441912],         [-0.29126267, -0.28990356,  0.68273307],         [-0.13870684, -0.453214  ,  1.02924452]],        [[ 1.03025589, -0.20542393,  0.71855423],         [-0.40312111, -0.09586122,  0.00740302],         [ 0.54204646,  1.07633607, -0.23386144],         [ 0.06289798,  0.02128197, -1.15631823]],        [[ 1.12197064, -0.18423948, -0.61632741],         [-1.38417149, -1.70282593,  0.42730971],         [ 0.52566924,  0.24153171,  0.60613443],         [-1.12691221, -1.67107417, -1.52135605]],        [[-2.31999217, -0.57238608, -0.66098013],         [ 1.72764717, -1.89471904,  0.36895925],         [-1.67735118,  0.6438323 , -1.73313038],         [-1.00737721, -0.60583479,  2.15804428]]]])>>> np.reshape(DATA,[-1,2,8,3]) # 对DATA数据进行reshape操作array([[[[-0.11245588,  0.46361267, -0.45861576],         [ 1.08045987, -0.0912301 ,  1.8826123 ],         [-0.51326317, -1.2739741 ,  0.96748474],         [ 1.5503973 ,  0.06333209,  0.89981012],         [ 0.29903728,  1.9080101 , -1.06983402],         [-0.9695859 , -1.47038233,  0.95528392],         [-1.02076298,  1.28100534,  0.48845259],         [ 1.04841292, -0.01142226,  0.10188068]],        [[ 0.3883587 ,  0.37042073, -0.0289424 ],         [ 0.53593898,  1.71126688,  0.1262282 ],         [ 0.92322512,  0.24725783,  0.8679894 ],         [-0.36954911,  0.74044357, -0.44616424],         [ 0.91045428, -0.24680013, -0.83070879],         [-0.34094366,  1.7384725 , -0.33322178],         [-0.75691129, -0.55346692, -0.06621144],         [-0.18568211, -0.90673854,  0.25074295]]],       [[[ 0.9069235 ,  0.60922932, -0.29551031],         [-1.34363931,  0.57989501,  0.18441912],         [-0.29126267, -0.28990356,  0.68273307],         [-0.13870684, -0.453214  ,  1.02924452],         [ 1.03025589, -0.20542393,  0.71855423],         [-0.40312111, -0.09586122,  0.00740302],         [ 0.54204646,  1.07633607, -0.23386144],         [ 0.06289798,  0.02128197, -1.15631823]],        [[ 1.12197064, -0.18423948, -0.61632741],         [-1.38417149, -1.70282593,  0.42730971],         [ 0.52566924,  0.24153171,  0.60613443],         [-1.12691221, -1.67107417, -1.52135605],         [-2.31999217, -0.57238608, -0.66098013],         [ 1.72764717, -1.89471904,  0.36895925],         [-1.67735118,  0.6438323 , -1.73313038],         [-1.00737721, -0.60583479,  2.15804428]]]])

tensorflow中的命令行解析

我们经常看到,在ubuntu的terminal下python xxx.py 时后面有时候会跟一些参数,如python xxx.py --name= 'yann',事实上,这种在命令行下给入参数的方式是通过tensorflow.flags的方式进行操作的。test_flag.py文件如下:

#encoding:utf-8 """由于添加了中文注释,所以必须有上面那一句且要在中文注释之前""""""这是一个test_flag.py文件用于测试命令行参数解析"""import tensorflow as tfflags = tf.flags #flags是文件flags.py,用于处理命令行参数的解析工作FLAGS = flags.FLAGS #FLAGS是flags中一个对象,保存了解析后的命令行参数#以下为调用flags的DEFINE_string函数,变量为flag类型不可更改,但可通过命令行传入,变量保存在flags.FLAGS对象中flags.DEFINE_string("model_name","default","name") #model_name为变量名,default为值,name为文档说明,用于解释model_name的使用flags.DEFINE_string("model_url","www.baidu.com","url")def main(argv=None): # argv=None必须要,表示可以传入参数    print 'name:',FLAGS.model_name,'url:',FLAGS.model_url     #调用命令行输入的参数,如果没有输入则为定义时默认参数if __name__ == "__main__":     tf.app.run() #解析命令行参数,调用main函数 main(sys.argv)"""如果我们是直接执行某个.py文件的时候,该文件中那么"__name__ == '__main__'"是True,则执行下面语句;但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。这个功能还有一个用处:调试代码的时候,在if __name__ == '__main__':中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!"""                                                   

在terminal下执行:

yann@Y:~$ python test_flag.py name: default url: www.baidu.comyann@Y:~$ python test_flag.py --model_name='yann' --model_url='www.bing.com'name: yann url: www.bing.com

具体实施还是看代码注释,解释比较清楚了。不懂的东西就要多看两遍。关于tensorflow中命令行参数解析就是这样,其实可以理解为c语言中,# define name 'yann'

psensor温度监控安装

安装psensor不仅仅是在安装psensor,还有m-sensors和hddtemp,各种硬件的温度监控包;安装时在进行sudo sensors-detect时有询问的一律yes就可以;最后全部完成最好重启一下系统。

yann@Y:~$ sudo apt-get install lm-sensors hddtempyann@Y:~$ sudo sensors-detectyann@Y:~$ sudo service module-init-tools startyann@Y:~$ sudo apt-get install psensor

这里写图片描述

OK,今天的总结就这些;
状态不好的时候就要耐住性子看东西,很快状态就好了!

原创粉丝点击