如何使用TensorFlow进行深度学习

看了挺久的例子始终对TensorFlow的深度学习机制不甚明了,因此特地写一下其使用流程吧,如有不对请纠正。

  • 1、准备数据

深度学习当中一般有train,validation,test三种数据集,前面两种可以将数据全部加载到程序当中再按照比例划分。

可选:将数据转换为tfrecord文件格式,据说可以加快大规模数据的加载速度。因为TensorFlow是以图的概念进行运行的,tensor(张量)相当于其中的变量。因此在这个过程开始你就看就到op = tf.xxx()的定义图节点(运算)语句以及session.run(op)的执行语句,例如:

import tensorflow as tf

# 创建一个变量, 初始化为标量 0.
a= tf.Variable(0)
# 创建一个常量1
b = tf.constant(1)
# 创建一个op, 其作用是实现加法,返回一个Tensor: sum    
sum = tf.add(a, b)

# 启动图后, 变量必须先经过`初始化` (init) op 初始化, 这时候首先必须增加一个`初始化` op 到图中.
init_op = tf.global_variables_initializer()

# 启动图, 运行 op
with tf.Session() as sess:
  # 运行 'init' op, 初始化图
  sess.run(init_op)
  # 执行计算并打印'state' 的初始值
  print (sess.run(sum))

ps: 为了使sum可以得到其他变量的和,引入了占位符如和feed_dict的概念,为使操作返回张量,引入fetch概念(可以理解为加了个‘[]’如sess.run( [sum]))。

  • 2、定义模型

定义模型是一个很复杂的过程, 一般可使用现有的网络模型,使用TensorFlow的上层封装如slim(太新,文档不全),Keras(抽象程度很高),TFLearn (抽象程度中等),Tensorlayer(额,可能和直接使用TensorFlow原语句差不多吧)

  • 3、进行训练

调用前面的程序进行训练。
由于深度学习需要调整的参数如学习率,训练次数等很多,还有输入输出目录,因此你执行程序的时候可能会需要定义或输入很多参数。

由于深度学习的参数和迭代次数很多,而这些参数变量又不是都同时使用,因此使用tf.train.Saver中的saver来保存历史数据到.ckpt文件中,并可使用restore()恢复其中的某个子集来进行迭代。在这个过程中如果模型对应一般不会有问题,但是要注意num_classes可能导致的错误

值得再提的是,文件名不用写全,哎,在这入坑了好久

这里写图片描述

对于常见的模型如VGG等可以使用在别人的.ckpt文件上进行训练,加快训练进度。

为了可视化模型和训练过程,使用TensorBoard,TensorBoard使用summary的概念来添加可视化节点。使用summary有关的方法。

训练过程使用tf.train.Saver()来保存训练过程中的参数

最后训练好的模型可以输出到.pb(二进制)或.pbtxt(文本)文件中。

  • 4、进行测试
    读取新的数据文件,并从.pb文件中读取参数,计算结果。也可以直接用ckpt文件来恢复模型

最后把脱了很久的代码补上吧:https://github.com/LeifPeng/VehicleClassify

  • 最后是进行深度学习实验的一下体会把

  • 首先关于测试

作为码农一般学习过程都要跑一跑别人的代码体会一下吧,在这个过程主要是环境配置的问题,CPU版比较简单,GPU版tensorflow和caffe可以参考后续的几篇文章。

  • 其次主要是数据处理

如何进行训练和测试,主要涉及数据的处理,这部分切不可大意,可以设置断点查看数据状态,如果训练过程会莫名其妙;再者,处理训练数据的时候一般会进行归一化处理,例如图片数据进行(data/255-0.5)->(-1,1),测试的时候也要对数据作归一化的处理,如果忘记将会得到错误的测试结果。这也是我呆了比较久的坑吧。

  • 最后是训练过程

一般学习用的机器性能都比较差,本人先用CPU后用GPU(4G),batch_size在较为复杂的模型中最大只能在10左右,不能抱有想看训练趋势而把学习率调大的想法,因为学习率过大会使模型参数过度拟合每一个batch数据块从而导致模型无法收敛,具体表现为loss一直在某个较大值域徘徊或者直接为nan,这时候很容易误认为是学习率过小,训练程度不够loss还没有下降(被自己天真笑哭),从而走上不归路(本人学艺不精,开始没有理解这些,在这个坑呆了大半个月之久,几乎训练任何模型都不成功)。正确的做法是如果batch_size过小,把学习率调小(我现在一般设置batch_size=10时 learning_rate=0.0001)。这并不是解决问题的最好办法,batch_size过小容易导致在在遇到每个batch数据块时局部过拟合,这样训练处理准确率相对较低,所以最好的方法大概是配好的机器了吧。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值