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,今天的总结就这些;
状态不好的时候就要耐住性子看东西,很快状态就好了!
- python中对象序列化及tensorflow的命令行参数解析
- Python的命令行参数解析
- python 命令行参数解析
- python 解析命令行参数
- python 命令行参数解析的标准模板
- python命令行参数解析实例
- Python命令行参数解析optparse
- 命令行参数的解析
- linux中解析命令行参数
- linux 中解析命令行参数
- LINUX中解析命令行参数
- python模块之argparse:强大的命令行参数解析模块
- [python]python的命令行参数
- Python中处理命令行参数
- tensorflow(2) 命令行参数
- TensorFlow 之命令行参数
- tensorflow命令行参数
- python命令行参数解析OptionParser类
- 取石子(一)
- BZOJ 3881: [Coci2015]Divljak
- 本地配置多个tomcat应用
- IDEA搭建SSM框架 以及环境配置
- LargestRectangleArea
- python中对象序列化及tensorflow的命令行参数解析
- PX4飞控之添加地面站参数
- Bellman-ford算法求解单源点最短路径初始版本
- java hashcode() 与 equals()
- Android 双屏异显
- Learining TypeScript (一) TypeScript 简介
- c++实现链表的基本操作
- 10分钟让你明白MySQL是如何利用索引的
- unity audio