我是靠谱客的博主 明理乐曲,最近开发中收集的这篇文章主要介绍tensorflow-CIFAR-10实例-代码解读,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简单做一个记录吧

纸质的写起来太费劲了,效率不高。

把一些函数揉在一起了,只能算伪代码了,因为是给人看的嘛。


最近看到cifar10.py中的

def train():

interence构建模型,最主要的是第一层定义


衰减系数wd 用于向 losses 添加L2正则化,可以防止过拟合,提高泛化能力:

def inference(images):
# conv1
  with tf.variable_scope('conv1') as scope:
    kernel = _variable_with_weight_decay('weights', #初始化weights
                                         shape=[5, 5, 3, 64],
                                         stddev=5e-2,
                                         wd=None)
        dtyoe=tf.float32    #或者64
        var = tf.get_variable(name,shape,tf.truncated_name_initializer)  #初始化最实质性的一步
    conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')  #tf标准的一步
    biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))    #以0初始化biases
    pre_activation = tf.nn.bias_add(conv, biases)   #标准步骤,将一维的biases加入N 维的conv
    conv1 = tf.nn.relu(pre_activation, name=scope.name)  #relu
    _activation_summary(conv1) #生成一个汇总,具体操作是下面三行
        tensor_name = re.sub('%s_[0-9]*/' % TOWER_NAME, '', x.op.name) #字符的匹配替换进行 【还不理解】
        tf.summary.histogram(tensor_name + '/activations', x)    #生成一个汇总直方图
        tf.summary.scalar(tensor_name + '/sparsity',    #先是归零,然后进行求和
                                       tf.nn.zero_fraction(x))
  # pool1
  pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],
                         padding='SAME', name='pool1')
  # norm1
  norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75,
                    name='norm1')
  #conv2
  #norm2
  #pool2
  #local3
  #local4
 with tf.variable_scope('local4') as scope:
    weights = _variable_with_weight_decay('weights', shape=[384, 192],
                                          stddev=0.04, wd=0.004)
    biases = _variable_on_cpu('biases', [192], tf.constant_initializer(0.1))
    local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name=scope.name)
    _activation_summary(local4)


  # laner layer(WX+b)  为提高效率,在logits层中内置了softmax层,因而没有显示的用softmax
  with tf.variable_scope('softmax_linear') as scope:
    weights = _variable_with_weight_decay('weights', [192, NUM_CLASSES],
                                          stddev=1/192.0, wd=None)
    biases = _variable_on_cpu('biases', [NUM_CLASSES],
                              tf.constant_initializer(0.0))
    softmax_linear = tf.add(tf.matmul(local4, weights), biases, name=scope.name)
    _activation_summary(softmax_linear)
return softmax_linear

模型构建完毕

视线回到train()函数中,计算loss

loss = cifar10.loss(logits,labels) #计算loss
    #返回float型的tensor
   labels = tf.cast(labels, tf.int64)    #转换类型,将labels投影到tf的格式中
   cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
labels=labels, logits=logits, name='cross_entropy_per_example') #softmsx标签要求是一个目标一定只有一个标签,而不是多个
 cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy') #按照这个维度来计算平均值
 tf.add_to_collection('losses', cross_entropy_mean) 【还不理解】
 # 按照L2来衰减,以loss之和、所有的权重而这作为总的loss  
 # decay terms (L2 loss).
return tf.add_n(tf.get_collection('losses'), name='total_loss') # get_collection返回一系列的值 由add加到tf中

得到loss之后,进行训练,更新一次模型的参数

train_op = cifar10.train(loss, global_step)

train_op = cifar10.train(loss, global_step)
    #
        num_batches_per_epoch = NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN / FLAGS.batch_size 
            #NUM——EXAMPLE是全局,50000个训练样本,剩余为测试样本,F.batch_size是人工输入的参数可以是128
        decay_steps = int(num_batches_per_epoch * NUM_EPOCHS_PER_DECAY) # 后者为全局变量,程序中写的350
            # 不断衰减学习率,指数衰减
            lr = tf.train.exponential_decay(INITIAL_LEARNING_RATE,
                                  global_step,  # learning_rate=decay rete^(globle_step/decay_steps)
                                  decay_steps,
                                  LEARNING_RATE_DECAY_FACTOR,
                                  staircase=True) #True时,为整数的变化,因此就会是阶梯状衰减
tf.summary.scalar('learning_rate',lr)    #输出包含单个标量值的摘要协议缓冲区。

生成所有损失和相关总和的 移动平均值 【还不理解】

loss_averages_op = _add_loss_summaries(total_loss)  #输入总的loss   返回用于生成移动均线的损失    
# 训练时保持参数的移动平均值通常是有益的, 加入0.9的衰减,使用# shadow_variable -= (1 - decay) * (shadow_variable - variable)来进行参数更新
loss_averages = tf.train.ExponentialMovingAverage(0.9, name='avg') # 训练时保持参数的移动平均值 
losses = tf.get_collection('losses') #将Graph.get_collection()使用默认gragh进行包装,返回一系列统一名字的列表
loss_averages_op = loss_averages.apply(losses + [total_loss])

计算梯度

  with tf.control_dependencies([loss_averages_op]): # 将Graph.control_dependencies()使用默认gragh进行包装
    opt = tf.train.GradientDescentOptimizer(lr) # 梯度下降算法的优化器
    grads = opt.compute_gradients(total_loss)    #计算梯度

# 将梯度应用与各个变量之中,
apply_gradient_op = opt.apply_gradients(grads, global_step=global_step)

在可训练参数以及梯度中 , 增加直方图,为可视化做准备

 for var in tf.trainable_variables():    #如果trainable被pass掉时,将新的变量增加到Gragh图中,返回变量Variable Objects的一个列表
    tf.summary.histogram(var.op.name, var) # 用于直方图输出摘要协议缓冲区。可以使数据在TendorBoard中可视化
  # Add histograms for gradients.  为梯度增加直方图
  for grad, var in grads:
    if grad is not None:
      tf.summary.histogram(var.op.name + '/gradients', grad)

跟踪所有变量的移动平均值

  # 更新后变量称为影子变量,采用滑动平均的方法更新参数
  variable_averages = tf.train.ExponentialMovingAverage(
      MOVING_AVERAGE_DECAY, global_step)
  variables_averages_op = variable_averages.apply(tf.trainable_variables())# trainable_variables上段有

将变量的依赖关系放在一起,返回一个整体

with tf.control_dependencies([apply_gradient_op, variables_averages_op]):#将一系列已经执行过的Tensor算子返回依赖关系【还不理解】
  train_op = tf.no_op(name='train') #op获得x,y,z的依赖关系,放在一个集合中一块进行操作
return train_op

跳出cifar10.py   

回到cifar10_train.py文件中,计算完train_op = cifar10.train(loss, global_step)  获得了有依赖关系的变量

#创建检查点与汇总保存的Hook, 
with tf.train.MonitoredTrainingSession(
        checkpoint_dir=FLAGS.train_dir, # 字符串,保存变量的位置
        hooks=[tf.train.StopAtStepHook(last_step=FLAGS.max_steps), # 参数1 设定停止训练的step
               tf.train.NanTensorHook(loss),    # 参数2 监控loss不出问题,否则报错
               _LoggerHook()],      #参数3   是一个类,记录log,包括loss和运行时间
                                其中tf.train.SessionRunHook用来最终确定graph,ops不再进行修改
        config=tf.ConfigProto(      #是tf.ConfigProto的一个实例,用来配置session
            log_device_placement=FLAGS.log_device_placement)) as mon_sess:
      while not mon_sess.should_stop():
        mon_sess.run(train_op)







几个不错的前辈的代码解读

https://blog.csdn.net/diamonjoy_zone/article/details/64905516


https://blog.csdn.net/hensonwells/article/details/75041175


https://blog.csdn.net/margretwg/article/details/70196001


https://zhuanlan.zhihu.com/p/25646408

anyway,宏观围观都要有


mnist很全的一个

https://blog.csdn.net/briblue/article/details/80398369

最后

以上就是明理乐曲为你收集整理的tensorflow-CIFAR-10实例-代码解读的全部内容,希望文章能够帮你解决tensorflow-CIFAR-10实例-代码解读所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部