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('\n')
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 网络。、

C4-ResNet-TF-小象cv-code的更多相关文章

  1. resNet代码-小象/cv

    C:\yyy\ml\dengsong\ChinaHadoop\ChinaHadoop_C4-master\ChinaHadoop_C4-master\C4_ResNet_TF http://blog. ...

  2. 用Spingboot获得微信小程序的Code以及openid和sessionkey

    ​ 这篇文章主要写的是怎么用spingboot来获取微信小程序的Code以及openid和sessionke,我觉得已经很详细了 我们要获得openid和sessionkey,就必须先要获得code, ...

  3. CV code references

    转:http://www.sigvc.org/bbs/thread-72-1-1.html 一.特征提取Feature Extraction:   SIFT [1] [Demo program][SI ...

  4. lesson7-图像描述 -小象cv

    2018-04-25朴素rcnn - 梯度消失严重LSTM长短时记忆模型,有效捕捉长时记忆包含四个神经元组:一个记忆神经元三个控制门神经元:输入.忘记.输出 注意:输入调制门.输出调制门 3个输入:前 ...

  5. lesson4-图像分类-小象cv

    CNN网络进化:AlexNet->VGG->GoogleNet->ResNet,深度8->19->22->152GoogleNet:Lsplit->trans ...

  6. 微信小程序通过CODE换取session_key和openid

    微信小程序的用户信息获取需要请求微信的服务器,通过小程序提供的API在小程序端获取CODE,然后将CODE传入到我们自己的服务器,用我们的服务器来换取session_key和openid. 小程序端比 ...

  7. 微信小程序登录 code 40029 天坑

    微信登录时 code 大坑(服务端返回如下代码) {"errcode":40029,"errmsg":"invalid code, hints: [ ...

  8. lesson5-图像检测-小象cv

    R-CNN: 2014,cnn为Alexnet 训练流程: 1)在imagenet上对cnn模型pre-train 2)使用所有ss生成区域对1)进行fine-tune ~softmax改为21维度 ...

  9. 微信小程序传code 拿token 后台报40029 状态吗,是为什么?

    看看是不是code用了两次,还有种可能,检查一下后台的appid

  10. lesson8-图像问答-小象cv

    QA即图像问答:覆盖最全面的AI,ai完备性 动态模型:不同任务需要不同模型 or 不同细分任务需要不同模型参数 数据集: 1)VQA,显示图片+抽象场景:每个问题给10个不同答案:含有无图片答案(考 ...

随机推荐

  1. ASP.NET Core Web 项目 发布的IIS7提示“HTTP Error 502.5 - Process Failure

    原因就是NUGET引用的DLL和SDK的版本不对, 你打开CMD,在项目bin目录运行dotnet xxx.dll, 会看到具体错误信息 所以你要么引用低版本的dll,要么升级最新SDK

  2. prefix word se sub suc sup suf sur out~s

    1★ se 区分开,分开 ,离开   2★ sub 接近,靠近,次一等 ,次的   3★ suc 4★ sup   5★ suf     6★ sur 在~下面    

  3. JAVA8的LocalDateTime使用心得和工具类

    今天做不成的事,明天也不会做好. 同学们,JAVA8出了这么久,不知道你们有没有用过它的LocalDateTime类型,还是依然用Date类型呢?其实,LocalDateTime类型给我们提供了很多便 ...

  4. Ubuntu上安装MySQL

    Ubuntu上安装MySQL非常简单只需要几条命令就可以完成.`````` sudo apt-get update sudo apt-get install mysql-server 会弹出提示,让输 ...

  5. CAD(镜像对象)(镜像后的微调)(门窗标注)5.14

    由于绘制的cad图形整体是对称的,所以先画了一半,然后再镜像过去.沿着某一对称轴. 注意:1.有些三维内容在二维是选择不上的.2.对称轴上的柱子和墙体之类的不能选中.把轴网和标注的图层锁起来.冻结起来 ...

  6. python 自然语言处理(三)____条件频率分布

    条件频率分布就是频率分布的集合,每个频率分布有一个不同的“条件”,这个条件通常是文本的类别.当语料文本分为几类(文体,主题,作者等)时,可以计算每个类别独立的频率分布,这样,就可以通过条件频率分布研究 ...

  7. Vue + Element UI 实现权限管理系统 (管理应用状态)

    使用 Vuex 管理应用状态 1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题.收缩 ...

  8. 【原创】<Debug> QString

    [问题1] 'class QString' has no member named 'toAscii' [解答] 把toAscii().data()改成toLatin1().data() 如果QStr ...

  9. Java关于反射

    反射的概念:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  10. Java线程的三种方式

    创建线程有三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future创建线程 三种方式详解如下: ---------------------------- ...