想必在linux系统上做开发的小伙伴们对命令行这种东西是熟悉的不能再熟悉了,linux系统时时刻刻都要通过命令行实现各种操作。但是作为资深的windows用户,我是不太习惯用cmd命令控制台去操作应用的。回到今天的主题,为了使我们用TensorFlow框架编写的深度学习代码更具有平台的通用性,有必要学习一下在windows上使用命令行去启动代码并且传入我们所需的各种参数,让代码能够正常的跑起来~ PS:其实linux系统和windows系统在使用命令行操作python代码的操作除了个别的操作符不同外,是几乎完全相同的。
前提:
- 安装好python3.3或者更高版本,添加argparse模块。cmd命令控制台下pip install argparse就OK~
- 安装好tensorflow框架(其实命令行控制是python通用的,但是tensorflow命令行操作基于自己的tf.app.flags,这点比较恶心)
- 在windows上一般会把要操作的一段cmd命令写成批处理文件(.bat),要了解.bat文件的基本知识
先说python通用的部分:
python中的argparse模块:专门用于参数传递,命令行解析。所以想要在命令行中操作python代码,就必须要事先用argparse模块在python代码中写好“接应代码”,命令行在外部操作,“里应外合”方能成事~
argparse模块的使用步骤:
- import argparse 在代码开头要导入这个模块
- parse = argparse.ArgumentParser 创建一个命令行解析处理器
- (1)parse.add_argument('--fullname'或者'-shortname' , type = .... , default = .....,action = ..) 其中"--"后的fullname表示这个参数的完整名称,当然也可以用“-”来表示简称,type规定了这个参数的类型,default是这个参数的默认值, action是默认行为。出现了default说明这个参数可选,你可以传递也可以不传递,不传递的时候就启用default默认值。可选参数的另外一个特征是名称前有“--”或者“-”。(2)parse.add_argument('name', type=.....) 其中name是参数名称,type是类型,这就表示这个参数必须有,必须传递进去,否则会出错。
- args = parse.parse_args() 获取参数
注意:1.命令行参数时常会配合os.path.expanduser()使用,它会把目录中的“~”转换成用户目录(注意用户目录并不是当前工作目录,这个每台机器会有不同,可以用print(os.path.expanduser("~"))查看)。
2.python中接受参数的最先入口是sys.arg[1: ], 这里接收后再给argparse处理,最后才把参数给程序。
以下是这种用法的一段代码示例:
def parse_arguments(argv): # 把argparse模块的功能封装在一个函数中
parser = argparse.ArgumentParser()
parser.add_argument('input_dir', type=str, help='Directory with unaligned images.')
parser.add_argument('output_dir', type=str, help='Directory with aligned face thumbnails.')
parser.add_argument('--image_size', type=int,
help='Image size (height, width) in pixels.', default=182)
parser.add_argument('--margin', type=int,
help='Margin for the crop around the bounding box (height, width) in pixels.', default=44)
parser.add_argument('--random_order',
help='Shuffles the order of images to enable alignment using multiple processes.', action='store_true')
parser.add_argument('--gpu_memory_fraction', type=float,
help='Upper bound on the amount of GPU memory that will be used by the process.', default=1.0)
return parser.parse_args(argv)
if __name__ == '__main__':
main(parse_arguments(sys.argv[1:]))# sys.arg先接收再给argparse“内应”写好了,看外部的命令怎么写:
python D:/Tensorflow/align_dataset_mtcnn.py ^
~/dataset/lfw/raw ^ %对应上面的必须有的参数input_dir%
~/dataset/lfw/raw_160 ^ %对应上面的必须有的参数output_dir%
--image_size=160 --margin=32 ^
--random_order 把这段代码保存为.bat文件,运行的时候直接双击就好了。解释一下代码里的“~”,表示“用户目录下”,因为这些数据什么的都放在这个目录里,参数传进来先使用os.path.expanduser(),可以省去手动写用户目录。PS:linux中无非就是把换行符“^”换成“\”,然后参数后不写“=”赋值,直接空格加参数值,直接在命令行里写就完了,不必像windows图方便要打包为 .bat文件
接下来看TensorFlow中独有的用法:
首先import tensorflow as tf, 它是通过tf.app.flags实现的
#第一个是参数名称,第二个参数是默认值,第三个是参数描述
tf.app.flags.DEFINE_string('str_name', 'def_v_1',"descrip1")
tf.app.flags.DEFINE_integer('int_name', 10,"descript2")
tf.app.flags.DEFINE_boolean('bool_name', False, "descript3")
#还可以DEFINE_float等获取参数传给程序:
FLAGS = tf.app.flags.FLAGS #形式上获取参数
FLAGS.str_name
FLAGS.int_name
FLAGS.bool_name最会要在main里run一下
if __name__ == '__main__':
tf.app.run() #执行main函数,真正获取传进来的参数外部传参的写法和上面的一毛一样,这里就不多重复了。
在tensorflow中也可以用argparse,我自己也比较习惯这种用法。但是官方提供的很多例子中直接用的是tf.app.flags, 明明已经有一个成熟的用法,tf还要自己搞一个,真的是有点绑架用户的感觉
~
本文介绍如何在Windows系统中使用命令行启动TensorFlow程序,并详细讲解argparse和tf.app.flags两种参数传递方式。


被折叠的 条评论
为什么被折叠?



