调优哪家强——tensorflow命令行参数

深度学习神经网络往往有过多的Hyperparameter需要调优,优化算法、学习率、卷积核尺寸等很多参数都需要不断调整,使用命令行参数是非常方便的。有两种实现方式,一是利用python的argparse包,二是调用tensorflow自带的app.flags实现。

利用python的argparse包

argparse介绍及基本使用:

http://www.jianshu.com/p/b8b09084bd1a

下面代码用argparse实现了命令行参数的输入。

import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('--fake_data', nargs='?', const=True, type=bool,                       
default=False,                       
help='If true, uses fake data for unit testing.')
parser.add_argument('--max_steps', type=int, default=1000,                       
help='Number of steps to run trainer.')
parser.add_argument('--learning_rate', type=float, default=0.001,                       
help='Initial learning rate')
parser.add_argument('--dropout', type=float, default=0.9,                       
help='Keep probability for training dropout.')
parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data',                       help='Directory for storing input data') parser.add_argument('--log_dir', type=str, default='/tmp/tensorflow/mnist/logs/mnist_with_summaries',                       
help='Summaries log directory') FLAGS, unparsed = parser.parse_known_args() tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

通过调用python的argparse包,调用函数parser.parse_known_args()解析命令行参数。代码运行后得到的FLAGS是一个结构体,内部参数分别为:

FLAGS.data_dir
Out[5]: '/tmp/tensorflow/mnist/input_data'
 FLAGS.fake_data Out[6]: False  FLAGS.max_steps
Out[7]: 1000
 FLAGS.learning_rate
Out[8]: 0.001
 FLAGS.dropout
Out[9]: 0.9
 FLAGS.data_dir
Out[10]: '/tmp/tensorflow/mnist/input_data'
 FLAGS.log_dir
Out[11]: '/tmp/tensorflow/mnist/logs/mnist_with_summaries'

利用tf.app.flags组件

首先需要定义一个tf.app.flags对象,调用自带的DEFINE_string, DEFINE_boolean, DEFINE_integer, DEFINE_float设置不同类型的命令行参数及其默认值。当然,也可以在终端用命令行参数修改这些默认值。

# Define hyperparameters
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_boolean("enable_colored_log", False, "Enable colored log")                     
"The glob pattern of train TFRecords files")
flags.DEFINE_string("validate_tfrecords_file",                     
"./data/a8a/a8a_test.libsvm.tfrecords",     
"The glob pattern of validate TFRecords files")
flags.DEFINE_integer("label_size", 2, "Number of label size")
flags.DEFINE_float("learning_rate", 0.01, "The learning rate")
 def main():    
 # Get hyperparameters     
if FLAGS.enable_colored_log:         
import coloredlogs         
coloredlogs.install()     
logging.basicConfig(level=logging.INFO)     
FEATURE_SIZE = FLAGS.feature_size     
LABEL_SIZE = FLAGS.label_size       
...   
return 0
if __name__ == ‘__main__’:     main()

这段代码采用的是tensorflow库中自带的tf.app.flags模块实现命令行参数的解析。如果用终端运行tf程序,用上述两种方式都可以,如果用spyder之类的工具,那么只有第一种方式有用,第二种方式会报错。

其中有个tf.app.flags组件,还有个tf.app.run()函数。官网帮助文件是这么说的:

flags module: Implementation of the flags interface.
run(...): Runs the program with an optional 'main' function and 'argv' list.

tf.app.run的源代码:

1."""Generic entry point script."""   
2.from __future__ import absolute_import   
3.from __future__ import division   
4.from __future__ import print_function   
5.   
6.import sys   
7.   
8.from tensorflow.python.platform import flags   
9.   
10.   
11.def run(main=None):   
12.  f = flags.FLAGS   
13.  f._parse_flags()   
14.  main = main or sys.modules['__main__'].main   
15.  sys.exit(main(sys.argv))

也就是处理flag解析,然后执行main函数。

用shell脚本实现训练代码的执行

在终端执行python代码,首先需要在代码文件开头写入shebang,告诉系统环境变量如何设置,用python2还是用python3来编译这段代码。然后修改代码权限为可执行,用 ./python_code.py 就可以执行。同理,这段代码也可以用shell脚本来实现。创建.sh文件,运行python_code.py并设置参数max_steps=100

python python_code.py --max_steps 100

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-10-31

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言中三种不同md5计算方式的性能比较

前言 本文主要介绍的是三种不同的 md5 计算方式,其实区别是读文件的不同,也就是磁盘 I/O, 所以也可以举一反三用在网络 I/O 上。下面来一起看看吧。 R...

3097
来自专栏Golang语言社区

Go基础系列:channel入门

channel用于goroutines之间的通信,让它们之间可以进行数据交换。像管道一样,一个goroutine_A向channel_A中放数据,另一个goro...

994
来自专栏游戏杂谈

使用phpexcel操作excel

使用这个组件最让我郁闷的是,它对sheet的名称为中文的不进行处理,暂时还没仔细去查原因。

1102
来自专栏我有一个梦想

QT Creator 快速入门教程 读书笔记(三)

一   信号和槽   GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘、绘制完成、点击鼠标、敲击键盘等。当事件发生时,UI 会产生相应的变化,让用户...

2488
来自专栏知了

ijst:基于反射的 C++ JSON 反序列化库

ijst (iJsonStruct) 一个是 C++ Json 序列化/反序列化库:

2315
来自专栏信安之路

ret2resolve学习笔记

一是做个总结,二是做个备份。上篇文章感谢@大米指出的错误,格式化字符串漏洞还未销声匿迹!!!

950
来自专栏Golang语言社区

Go语言中三种不同md5计算方式的性能比较

前言 本文主要介绍的是三种不同的 md5 计算方式,其实区别是读文件的不同,也就是磁盘 I/O, 所以也可以举一反三用在网络 I/O 上。下面来一起看看吧。 R...

46010
来自专栏Java学习网

Java Web Response对象的27个方法及状态码

response表示HttpServletResponse对象,主要将JSP容器处理后的结果传回到客户端。 ? 网络配图 1、void addCookie(...

2677
来自专栏木木玲

Netty 源码解析 ——— AdaptiveRecvByteBufAllocator

2712
来自专栏ChaMd5安全团队

NSCTF &SteinsGate&详细writeup

NSCTF "SteinsGate"详细writeup From ChaMd5安全团队核心成员 sherlly 0x00 前言 挺不错的一道题,思路值得学习,所...

31611

扫码关注云+社区