zoukankan      html  css  js  c++  java
  • C4-ResNet-TF-小象cv-code

    https://blog.csdn.net/chaipp0607/article/details/75577305

    https://blog.csdn.net/leastsq/article/details/54374909

    tf.logging.set_verbosity(tf.logging.INFO) 现在运行代码时,将看到如下的附加日志输出: INFO:tensorflow:loss = 1.18812, step = 1INFO:

    tf.app.run() ~进入main ~elif FLAGS.num_gpus == 1:自动找到gpu
     
    # 残差网络模型参数
      hps = resnet_model.HParams(batch_size=batch_size,
                                 num_classes=num_classes,
                                 min_lrn_rate=0.0001,
                                 lrn_rate=0.1,
                                 num_residual_units=5,
                                 use_bottleneck=False,
                                 weight_decay_rate=0.0002,
                                 relu_leakiness=0.1,
                                 optimizer='mom')
    bottleneck:
    通过已经训练好的模型,把bottleneck特征抽取出来,然后滚到下一个“小”模型里面,也就是全连接层。
    实施步骤为:
    1、把训练好的模型的权重拿来,model;
    2、运行,提取bottleneck feature(网络在全连接之前的最后一层激活的feature map,卷积-全连接层之间),单独拿出来,并保存
    3、bottleneck层数据,之后 + dense全连接层,进行fine-tuning
    提取图片的bottleneck特征需要步骤:
    1、载入图片;
    2、灌入pre-model的权重;
    3、得到bottleneck feature
    --》使用哪种残差单元(带bottleneck还是不带bottleneck)

    对于文件名队列,我们使用tf.train.string_input_producer函数。这个函数需要传入一个文件名list,系统会自动将它转为一个文件名队列。

    我们必须要把数据先读入后才能进行计算,假设读入用时0.1s,计算用时0.9s,那么就意味着每过1s,GPU都会有0.1s无事可做,这就大大降低了运算的效率。。而使用tf.train.start_queue_runners之后,才会启动填充队列的线程,这时系统就不再“停滞”。此后计算单元就可以拿到数据并进行计算,整个程序也就跑起来了

    tf.FixedLengthRecordReader是读取固定长度字节数信息(针对bin文件使用FixedLengthRecordReader读取比较合适),结果表明下次调用时会接着上次读取的位置继续读取文件,而不会从头开始读取。
    例如:
    import tensorflow as tf

    filenames = ['D:/Tensorflow/test/txt1.txt']
    filename_queue = tf.train.string_input_producer(filenames)
    reader = tf.FixedLengthRecordReader(record_bytes=4)
    key, value = reader.read(filename_queue)
    b = value
    sess = tf.InteractiveSession()
    tf.train.start_queue_runners(sess=sess)
    print(sess.run(b))
    print(' ')
    print(sess.run(b))
    --》txt1.txt文件中就有4字节的内容

    https://zhuanlan.zhihu.com/p/27238630   tf读取机制~队列

    decode_raw操作可以讲一个字符串转换为一个uint8的张量

    tf.cast(x, dtype, name=None) 将x的数据格式转化成dtype.例如,原来x的数据格式是bool, 那么将其转化成float以后,就能够将其转化成0和1的序列。

    tf.slice() 从返回值上去理解,现在假设input的shape是[a1, a2, a3], begin的值是[b1, b2, b3],size的值是[s1, s2, s3],那么tf.slice()返回的值就是 input[b1:b1+s1, b2:b2+s2, b3:b3+s3]。
    如果 si=−1 ,那么 返回值就是 input[b1:b1+s1,..., bi: ,...]

    tf.contrib.framework.get_or_create_global_step()得到目前模型训练到达全局步数。

    bottleneck残差模块让残差网络可以向更深的方向上走,原因就是因为同一通道数的情况下,bottleneck残差模块要比朴素残差模块节省大量的参数,一个单元内的参数少了,对应的就可以做出更深的结构。

    产生一个滑动平均计算对象,MOVING_AVERAGE_DECAY = 0.999,则每一代中的decay值更新如下
               min(decay, (1 + num_updates) / (10 + num_updates))
    采用这个计算得到的decay值对上面梯度法更新得到的所有参数进行平滑处理如下:
                shadow_variable = decay * shadow_variable + (1 - decay) * variable

     

    tf.identity()和tf.group()均可将语句变为操作

    tf.nn.moments(x, axes, shift=None, name=None, keep_dims=False) 直接计算均值与方差

    https://blog.csdn.net/a_a_ron/article/details/79048446
    tf.where的用法,注意矩阵的维度

    https://www.jianshu.com/p/0312e04e4e83
    tf.nn.batch_normalization
    注意其中scale和offset的定义
    计算moving mean(滑动平均)、moving variance(滑动方差),然后利用 (moving_mean, moving_variance) 进行网络测试。

    函数原型 tf.slice(inputs,begin,size,name='') 2,用途:从inputs中抽取部分内容      inputs:可以是list,array,tensor  

     #图像字节数
      image_bytes = result.height * result.width * result.depth
      # Every record consists of a label followed by the image, with a
      # fixed number of bytes for each.
      # 每一条样本记录由 标签 + 图像 组成,其字节数是固定的。
      record_bytes = label_bytes + image_bytes

      # Read a record, getting filenames from the filename_queue.  No
      # header or footer in the CIFAR-10 format, so we leave header_bytes
      # and footer_bytes at their default of 0.
      # 创建一个固定长度记录读取器,读取一个样本记录的所有字节(label_bytes + image_bytes)

    tf.argmax(vector, 1):返回的是vector中的最大值的索引号,如果vector是一个向量,那就返回一个值,如果是一个矩阵,那就返回一个向量,这个向量的每一个维度都是相对应矩阵行的最大值元素的索引号。

    https://www.cnblogs.com/wyh1993/p/1f142f2d7daab0a8d74907f1d44effe7.html
    tensorboard及summary data  ~~  可视化

    # 计算预测准确率
      truth = tf.argmax(model.labels, axis=1) 
      predictions = tf.argmax(model.predictions, axis=1)
      precision = tf.reduce_mean(tf.to_float(tf.equal(predictions, truth)))
    标签是(128,10),所以argmax就是取10个num-classes中概率数值最大的

    tf.ConfigProto一般用在创建session的时候。用来对session进行参数配置
    with tf.Session(config = tf.ConfigProto(...),...)

    #tf.ConfigProto()的参数
    log_device_placement=True : 是否打印设备分配日志
    allow_soft_placement=True : 如果你指定的设备不存在,允许TF自动分配设备
    tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)

    six是用来兼容python 2 和 3的,six.moves 是用来处理那些在2 和 3里面函数的位置有变化的,直接用six.moves就可以屏蔽掉这些变化

    将下面的行添加到代码的开头(在导入之后):
    tf.logging.set_verbosity(tf.logging.INFO)
    现在运行代码时,将看到如下的附加日志输出:
    INFO:tensorflow:loss = 1.18812, step = 1
    INFO:tensorflow:loss = 0.210323, step = 101
    INFO:tensorflow:loss = 0.109025, step = 201
    带有INFO级别的日志,tf.contrib.learn每100步骤自动输出training-loss metrics到stderr。

    https://blog.csdn.net/circleyuanquan/article/details/60875016
    在普通网络(图2中间)的基础上,我们对其引入了快捷连接(shortcut connection),即将普通网络转换为残差网络。当输入与输出具有相同维度时(即之间用实线连接),可以直接使用快捷连接。当维度增加时(即之间用虚线连接),我们考虑两个方面,(1)直接执行恒等映射,并且使用零填充的方式来保持参数的不变;(2)用式 这里写图片描述来进行计算,并且在卷积之后激活函数之前对其进行批量归一化处理。


    https://blog.csdn.net/mao_feng/article/details/52734438
    resnet学习的是残差函数F(x) = H(x) - x, 这里如果F(x) = 0, 那么就是上面提到的恒等映射。事实上,resnet是“shortcut connections”的在connections是在恒等映射下的特殊情况,它没有引入额外的参数和计算复杂度。 假如优化目标函数是逼近一个恒等映射, 而不是0映射, 那么学习找到对恒等映射的扰动会比重新学习一个映射函数要容易。
     
    当需要对输入和输出维数进行变化时(如改变通道数目),可以在shortcut时对x做一个线性变换Ws,如下式,然而实验证明x已经足够了,不需要再搞个维度变换,除非需求是某个特定维度的输出,如文章开头的resnet网络结构图中的虚线,是将通道数翻倍。

    为什么每个大conv模块只有在改变颜色(即feature map大小改变)时,残差直连会有conv、bnr和pool?---
    一个残差模块(Fig 2)是由两层卷积再加一个恒等映射组成的。相同颜色块之间的 feature map 的大小是一样的,因此残差模块的输入输出的维度大小也是一样,可以直接进行相加(如 Fig 1中的实曲线)网络延伸到不同颜色块时都要经过2倍下采样或者是 stride=2 的卷积,那么这时 feature map 的大小都会减半,但是卷积核的数量会增加一倍,这样是为了保持时间的复杂度,那么残差模块的输入和输出大小不一样的时应该要怎么办?这里采用论文中的 B 方法:用 1X1 的卷积核来映射到跟输出一样的维度(如 Fig 1中的虚曲线)。ResNet 的大体结构是还是参照 VGG 网络。、

  • 相关阅读:
    【转载】关于sql server 代理(已禁用代理xp)
    Silverlight中将WriteableBitmap互转byte数组
    思迅Pay PC ,WIN7 ,KB3042058
    微软新Edge浏览器 WIN7 无法登录
    List<SelectListItem> 转为 SelectList
    图片jpg,png转为BASE64编码
    “Newtonsoft.Json”已拥有为“Microsoft.CSharp”定义的依赖项。
    mac os 10.15.1 懒人 .CDR
    微信刷脸SDK获取sub_openid
    win7 安装 visual studio 2019 时闪退(VS2019)
  • 原文地址:https://www.cnblogs.com/rosyYY/p/8876025.html
Copyright © 2011-2022 走看看