TensorFlow 搭建网络

步骤:

  1. 数据处理:将数据喂给网络
  2. 搭建网络模型
  3. Loss
  4. 训练模型
  5. 测试

第一步 数据处理

Train_TFRecords_00123
Train_TFRecords_00017
......
  • 数据存储地址TFRecordPath
  • os.listdir(TFRecordPath)得到数据文件队列;
  • 将文件名列表交给tf.train.string_input_producer函数,得到一个乱序的先入先出的队列;
  • 使用文件阅读器得到单个图片和标签,这里我的数据集是FTRecord格式,所以使用tf.TFRecordReader()解析数据集
  • 批处理:用tf.train.shuffle_batch函数来对队列中的样本进行乱序批处理,得到
    images: Images. 4D tensor of [batch_size, height, width, 3] size.
    labels: Labels. 1D tensor of [batch_size] size.

参考文献:数据读取
以上代码,我们写在input.py里,调用input函数可得到批处理后的结果
报错:

 All shapes must be fully defined: [TensorShape([Dimension(None)]), TensorShape([Dimension(None)])]

https://stackoverflow.com/questions/39322441/tf-train-shuffle-batch-not-working-for-me
https://blog.csdn.net/wuguangbin1230/article/details/64441654

第二步 搭建网络模型

  1. 模型输入:调用input.pyinput函数得到输入
  2. 模型预测 : 通常使用inference函数写,计算预测值的 logits
def inference(images):
	with tf.variable_scope('conv1') as scope:
	  	  kernel = _variable_with_weight_decay('weights', shape=[5, 5, 3, 64], stddev=1e-4, wd=0.0)
    	  conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
          biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
          bias = tf.nn.bias_add(conv, biases)
          conv1 = tf.nn.relu(bias, name=scope.name)

上面给出第一层网络的代码,其它层同理。
3. 首先处理共享变量的问题
tf.variable_scopetf.get_variable解决了变量重用的问题。每次调用inference函数时,变量不会反复被创建,而是对所有的图片共享一套变量。
4. tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
使用VALID方式, feature map的尺寸为 (3,3,1,32)卷积权重
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1])) (28-3+1) / 1 = 26,(28-3+1) / 2 = 13
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2])) (28-3+1) / 1 = 26,(28-3+1) / 2 = 13
使用使用SAME方式, feature map的尺寸为 (3,3,1,32)卷积权重
out_height = ceil(float(in_height) / float(strides[1])) 28 / 1 = 28,28 / 2 = 14
out_width = ceil(float(in_width) / float(strides[2])) 28 / 1 = 28,28 / 2 = 14
参考资料
6.我还使用了局部响应归一化:
局部响应归一化参考资料
5. Softmax 回归:
对线性回归,logistic回归和一般回归的认识

第三步 Loss

  1. 输入预测值(调用inference得到预测值logits)和标签
  2. 处理标签:
    数据集中的标签形式类似为[0 2 2 1 0 3],我们要用tf.sparse_to_dense函数,将它处理成onehot标签
[[ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 0.  0.  0.  1.]
 [ 1.  0.  0.  0.]
 [ 0.  1.  0.  0.]
 [ 1.  0.  0.  0.]]
  1. 计算交叉熵
    先用tf.nn.softmax_cross_entropy_with_logits函数,返回值是一个向量;再使tf.reduce_mean操作,对向量求均值;得到最终的loss。参考资料
    Tensorflow基础知识—损失函数详解
  2. 对所有loss求和
    tf.add_to_collection:把变量放入一个集合,把很多变量变成一个列表
    tf.get_collection:从一个结合中取出全部变量,是一个列表
    tf.add_n:把一个列表的东西都依次加起来

第四步 训练

训练一个可进行N维分类的网络的常用方法是使用多项式逻辑回归,又被叫做softmax 回归。Softmax 回归在网络的输出层上附加了一个softmax nonlinearity,并且计算归一化的预测值和label的1-hot encoding的交叉熵。在正则化过程中,我们会对所有学习变量应用权重衰减损失。模型的目标函数是求交叉熵损失和所有权重衰减项的和,loss()函数的返回值就是这个值。

指数衰减法:
tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
参数:

  • learning_rate - 初始学习率
  • global_step - 用于衰减计算的全局步骤。 一定不为负数。喂入一次 BACTH_SIZE 计为一次 global_step
  • decay_steps - 衰减速度,一定不能为负数,每间隔decay_steps次更新一次learning_rate值
  • decay_rate - 衰减系数,衰减速率,其具体意义参看函数计算方程(对应α^t中的α)。
  • staircase - 若 ‘ True ’ ,则学习率衰减呈 ‘ 离散间隔 ’ (discrete intervals),具体地讲,global_step / decay_steps是整数除法,衰减学习率( the decayed learning rate )遵循阶梯函数;若为 ’ False ‘ ,则更新学习率的值是一个连续的过程,每步都会更新学习率。
  • 返回值: 与初始学习率 ‘ learning_rate ’ 相同的标量 ’ Tensor ‘ 。
  • 优点:训练伊始可以使用较大学习率,以快速得到比较优的解。后期通过逐步衰减后的学习率进行迭代训练,以使模型在训练后期更加稳定。

滑动平均
tf.train.ExponentialMovingAverage

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值