想必在linux系统上做开发的小伙伴们对命令行这种东西是熟悉的不能再熟悉了,linux系统时时刻刻都要通过命令行实现各种操作。但是作为资深的windows用户,我是不太习惯用cmd命令控制台去操作应用的。回到今天的主题,为了使我们用TensorFlow框架编写的深度学习代码更具有平台的通用性,有必要学习一下在windows上使用命令行去启动代码并且传入我们所需的各种参数,让代码能够正常的跑起来~ PS:其实linux系统和windows系统在使用命令行操作python代码的操作除了个别的操作符不同外,是几乎完全相同的。
前提:
先说python通用的部分:
python中的argparse模块:专门用于参数传递,命令行解析。所以想要在命令行中操作python代码,就必须要事先用argparse模块在python代码中写好“接应代码”,命令行在外部操作,“里应外合”方能成事~
argparse模块的使用步骤:
注意: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还要自己搞一个,真的是有点绑架用户的感觉~