python和tensorflow处理命令行参数的方法

1.使用optparse模块

Python 有两个内建的模块用于处理命令行参数:一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数;另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix/DOS 规范的命令行说明。optpars是python中用来处理命令行参数的模块,可以自动生成程序的帮助信息,功能强大,易于使用,可以方便的生成标准的,符合Unix/Posix 规范的命令行说明。使用add_option()来加入选项,使用parse_args()来解析命令行。

add_option()中参数

第一个参数表示option的缩写,以单个中划线引导,例如-f、-d,只能用单个字母,可以使用大写;

第二个参数表示option的全拼,以两个中划线引导,例如--file、--Opencv_version;

第一第二个参数可以单独使用,也可以同时使用,但必须保证有其中一个;

从第三个参数开始是命名参数,是可选参数,常用的几个:

type=表示输入命令行参数的值的类型,默认为string,可以指定为string, int, choice, float,complex其中一种;

default=表示命令参数的默认值;

metavar=显示到帮助文档中用来提示用户输入期望的命令参数;

dest=指定参数在options对象中成员的名称,如果没有指定dest参数,将用命令行参数名来对options对象的值进行取;

help=显示在帮助文档中的信息;

解析命令行

(options, args) = parse.parse_args()

或在main(argv)函数里:

(options, args) = parser.parse_args(argv)

options,是一个对象(optpars.Values),保存有命令行参数值。通过命令行参数名,如 file,访问其对应的值: options.file ;

args,是一个由positional arguments组成的列表;

例:

test.py

import sys
from optparse import OptionParser
     
parser = OptionParser()
     
parser.add_option('-f','--file',type=str,default='./image',help='file path of images',dest='file_path')

parser.add_option('--weights','-w',type=str,default='./weights_saved',help="file location of the trained network weights")

parser.add_option('--iterations','-i',type=int,default=10000,help='iteration time of CRNN Net')

parser.add_option('--gpu','-g',type=int,default=0,help="gpu id")
     
     
def main(argv):
    (options, args) = parser.parse_args()
    (options, args) = parser.parse_args(argv)   # both OK
     
    print('file path of images:  ' + options.file_path)
    print("file location of the trained network weights:  " + options.weights)
    print('iteration time of CRNN Net:  ' + str(options.iterations)
    print('gpu id:  ' + str(options.gpu)
     
     
if __name__ == '__main__':
   main(sys.argv)

查看帮助文档:

python test.py -h

显示:

输入命令行参数:

python test.py -f ../tensorflow/train_image -w ../tensorflow/weights -i 5000 -g 2

输出:

2.使用tensorflow中的tf.app.flags.FLAGS模块

tf 中定义了 tf.app.flags.FLAGS ,用于接受从终端传入的命令行参数,相当于对python中的命令行参数模块optpars做了一层封装。

例:

#coding:utf-8
 
# 学习使用 tf.app.flags 使用全局变量
# 可以再命令行中运行也是比较方便,如果只写 python app_flags.py 则代码运行时默认程序里面设置的默认设置
# 若 python app_flags.py --train_data_path <绝对路径 train.txt> --max_sentence_len 100
#    --embedding_size 100 --learning_rate 0.05  代码再执行的时候将会按照上面的参数来运行程序
 
import tensorflow as tf
 
FLAGS = tf.app.flags.FLAGS
 
# tf.app.flags.DEFINE_string("param_name", "default_val", "description")
tf.app.flags.DEFINE_string("train_data_path", "/home/yongcai/chinese_fenci/train.txt", "training data dir")
tf.app.flags.DEFINE_string("log_dir", "./logs", " the log dir")
tf.app.flags.DEFINE_integer("max_sentence_len", 80, "max num of tokens per query")
tf.app.flags.DEFINE_integer("embedding_size", 50, "embedding size") 
tf.app.flags.DEFINE_float("learning_rate", 0.001, "learning rate")
 
 
def main(unused_argv):
    train_data_path = FLAGS.train_data_path
    print("train_data_path", train_data_path)
    max_sentence_len = FLAGS.max_sentence_len
    print("max_sentence_len", max_sentence_len)
    embdeeing_size = FLAGS.embedding_size
    print("embedding_size", embdeeing_size)
    abc = tf.add(max_sentence_len, embdeeing_size)
 
    init = tf.global_variables_initializer()
 
    #with tf.Session() as sess:
        #sess.run(init)
        #print("abc", sess.run(abc))
 
    sv = tf.train.Supervisor(logdir=FLAGS.log_dir, init_op=init)
    with sv.managed_session() as sess:
        print("abc:", sess.run(abc))
 
        # sv.saver.save(sess, "/home/yongcai/tmp/")
 
 
# 使用这种方式保证了,如果此文件被其他文件 import的时候,不会执行main 函数
if __name__ == '__main__':
    tf.app.run()   # 解析命令行参数,调用main 函数 main(sys.argv)

输出:

可以根据需求对参数进行修改:

python test.py --train_data_path <绝对路径 train.txt> --max_sentence_len 100 --embedding_size 100 --learning_rate 0.05

可以看到参数已经改变,如果这样调用:

python test.py

则会执行程序时会自动调用程序中default中的参数。

解释

和optpars中的参数类型类似是通过参数 “type=xxx” 定义的,tf中每个合法类型都有对应的 “DEFINE_xxx”函数。常用:

  • tf.app.flags.DEFINE_string() :定义一个用于接收string类型数值的变量;
  • tf.app.flags.DEFINE_integer() : 定义一个用于接收int类型数值的变量;
  • tf.app.flags.DEFINE_float() : 定义一个用于接收float类型数值的变量;
  • tf.app.flags.DEFINE_boolean() : 定义一个用于接收bool类型数值的变量;

“DEFINE_xxx”函数带3个参数,分别是变量名称,默认值,用法描述,例如:

tf.app.flags.DEFINE_string('ckpt_path', 'model/model.ckpt-100000', '''Checkpoint directory to restore''')

下面给一个完整的例子 

定义一个名称是 "ckpt_path" 的变量,默认值是 ckpt_path = 'model/model.ckpt-100000',描述信息表明这是一个用于保存节点信息的路径。

# -*- coding=utf-8 -*-
import tensorflow  as tf
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('ckpt_path', 'model/model.ckpt-100000', '''模型保存路径''')
tf.app.flags.DEFINE_float('learning_rate',0.0001,'''初始学习率''')
tf.app.flags.DEFINE_integer('train_steps', 50000, '''总的训练轮数''')
tf.app.flags.DEFINE_boolean('is_use_gpu', False, '''是否使用GPU''')
print('模型保存路径: {}'.format(FLAGS.ckpt_path))
print('初始学习率: {}'.format(FLAGS.learning_rate))
print('总的训练次数: {}'.format(FLAGS.train_steps))
print('是否使用GPU: {}'.format(FLAGS.is_use_gpu))

按默认执行结果如下:

重新设定默认值,并运行结果如下:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏duanliuyao

Cassandra应用实践

执行bin/cqlsh ip即可cassandra的shell客户端,可以执行的CQL命令和mysql比较类似。

28330
来自专栏python入门学习

Python是什么?简单了解pythonp-入门

解释性语言:在系统中运行时需要使用解释器(如:php、java)  编译性语言:在系统中运行不需要解释器,可以直接运行(如:C、C++)

13100
来自专栏用户2442861的专栏

caffe源码分析-SyncedMemory

本文主要分析caffe中Blob内存管理类SyncedMemory,主要内容包括:

10720
来自专栏机器学习从入门到成神

Python3迁移接口变化采坑记

"/”符号运算后是正常的运算结果,那么,我们要想只取整数部分怎么办呢?原来在python3之后,“//”有这个功能:

9120
来自专栏用户2442861的专栏

c++ mnist转化为opecv Mat

本文主要介绍如何使用C++将mnist 数据集转化为Opencv Mat,问题来源主要代码以及运行示例如下:

10820
来自专栏用户2442861的专栏

caffe源码分析-ReLULayer

激活函数如:ReLu,Sigmoid等layer相对较为简单,所以在分析InnerProductLayer前,我们先看下激活函数层。

10910
来自专栏Python爬虫与数据挖掘

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目(上),今天我们进一步深入的了解Scrapy爬虫项目创建,这里以伯乐在线网站的所有文章...

13630
来自专栏用户2442861的专栏

caffe源码分析-inner_product_layer

本文主要分析caffe inner_product_layer源码,主要内容如下:

11610
来自专栏GAN&CV

在Pytorch和Keras等框架上自由使用tensorboard

在这篇博文中,将向你展示如何自由的在任何Python代码中使用Tensorboard。

15040
来自专栏李蔚蓬的专栏

关于Jupyter notebook的安装以及一些使用心得

我们知道jupyter notebook对后期各种代码的管理和运行,还是十分比较方便的,在这周我把它安装好了,并且顺溜地用起来

17520

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励