概述
步骤:
- 数据处理:将数据喂给网络
- 搭建网络模型
- Loss
- 训练模型
- 测试
第一步 数据处理
- 将数据集处理成
FTRecord
的标准格式(也可以是其它格式,详见下面的参考链接)
将数据传给TensorFlow
TensorFlow 读取自己的数据集 - 数据存储形式如下:
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
第二步 搭建网络模型
- 模型输入:调用
input.py
中input
函数得到输入 - 模型预测 : 通常使用
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_scope
和tf.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
- 输入预测值(调用
inference
得到预测值logits)和标签 - 处理标签:
数据集中的标签形式类似为[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.]]
- 计算交叉熵
先用tf.nn.softmax_cross_entropy_with_logits
函数,返回值是一个向量;再使tf.reduce_mean
操作,对向量求均值;得到最终的loss。参考资料
Tensorflow基础知识—损失函数详解 - 对所有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
最后
以上就是喜悦小虾米为你收集整理的TensorFlow 搭建网络第一步 数据处理第二步 搭建网络模型第三步 Loss第四步 训练的全部内容,希望文章能够帮你解决TensorFlow 搭建网络第一步 数据处理第二步 搭建网络模型第三步 Loss第四步 训练所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复