TensorFlow框架做深度学习之命令行参数操作

想必在linux系统上做开发的小伙伴们对命令行这种东西是熟悉的不能再熟悉了,linux系统时时刻刻都要通过命令行实现各种操作。但是作为资深的windows用户,我是不太习惯用cmd命令控制台去操作应用的。回到今天的主题,为了使我们用TensorFlow框架编写的深度学习代码更具有平台的通用性,有必要学习一下在windows上使用命令行去启动代码并且传入我们所需的各种参数,让代码能够正常的跑起来~ PS:其实linux系统和windows系统在使用命令行操作python代码的操作除了个别的操作符不同外,是几乎完全相同的。

前提:

  1. 安装好python3.3或者更高版本,添加argparse模块。cmd命令控制台下pip install argparse就OK~
  2. 安装好tensorflow框架(其实命令行控制是python通用的,但是tensorflow命令行操作基于自己的tf.app.flags,这点比较恶心)
  3. 在windows上一般会把要操作的一段cmd命令写成批处理文件(.bat),要了解.bat文件的基本知识

先说python通用的部分:

python中的argparse模块:专门用于参数传递,命令行解析。所以想要在命令行中操作python代码,就必须要事先用argparse模块在python代码中写好“接应代码”,命令行在外部操作,“里应外合”方能成事~

argparse模块的使用步骤:

  1. import argparse 在代码开头要导入这个模块
  2. parse = argparse.ArgumentParser  创建一个命令行解析处理器
  3. (1)parse.add_argument('--fullname'或者'-shortname' , type = .... , default = .....,action = ..)   其中"--"后的fullname表示这个参数的完整名称,当然也可以用“-”来表示简称,type规定了这个参数的类型,default是这个参数的默认值, action是默认行为。出现了default说明这个参数可选,你可以传递也可以不传递,不传递的时候就启用default默认值。可选参数的另外一个特征是名称前有“--”或者“-”。(2)parse.add_argument('name', type=.....) 其中name是参数名称,type是类型,这就表示这个参数必须有,必须传递进去,否则会出错。
  4. 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还要自己搞一个,真的是有点绑架用户的感觉~


就写这么多吧,算是学习中的一个记录。



你可能感兴趣的:(TensorFlow框架做深度学习之命令行参数操作)