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

虽然这两天状态有些差,但是断断续续的看代码还是学到了一点东西,关于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 tf
flags = 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.com
yann@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 hddtemp
yann@Y:~$ sudo sensors-detect
yann@Y:~$ sudo service module-init-tools start
yann@Y:~$ sudo apt-get install psensor

这里写图片描述

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