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('\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的更多相关文章
- resNet代码-小象/cv
C:\yyy\ml\dengsong\ChinaHadoop\ChinaHadoop_C4-master\ChinaHadoop_C4-master\C4_ResNet_TF http://blog. ...
- 用Spingboot获得微信小程序的Code以及openid和sessionkey
这篇文章主要写的是怎么用spingboot来获取微信小程序的Code以及openid和sessionke,我觉得已经很详细了 我们要获得openid和sessionkey,就必须先要获得code, ...
- CV code references
转:http://www.sigvc.org/bbs/thread-72-1-1.html 一.特征提取Feature Extraction: SIFT [1] [Demo program][SI ...
- lesson7-图像描述 -小象cv
2018-04-25朴素rcnn - 梯度消失严重LSTM长短时记忆模型,有效捕捉长时记忆包含四个神经元组:一个记忆神经元三个控制门神经元:输入.忘记.输出 注意:输入调制门.输出调制门 3个输入:前 ...
- lesson4-图像分类-小象cv
CNN网络进化:AlexNet->VGG->GoogleNet->ResNet,深度8->19->22->152GoogleNet:Lsplit->trans ...
- 微信小程序通过CODE换取session_key和openid
微信小程序的用户信息获取需要请求微信的服务器,通过小程序提供的API在小程序端获取CODE,然后将CODE传入到我们自己的服务器,用我们的服务器来换取session_key和openid. 小程序端比 ...
- 微信小程序登录 code 40029 天坑
微信登录时 code 大坑(服务端返回如下代码) {"errcode":40029,"errmsg":"invalid code, hints: [ ...
- lesson5-图像检测-小象cv
R-CNN: 2014,cnn为Alexnet 训练流程: 1)在imagenet上对cnn模型pre-train 2)使用所有ss生成区域对1)进行fine-tune ~softmax改为21维度 ...
- 微信小程序传code 拿token 后台报40029 状态吗,是为什么?
看看是不是code用了两次,还有种可能,检查一下后台的appid
- lesson8-图像问答-小象cv
QA即图像问答:覆盖最全面的AI,ai完备性 动态模型:不同任务需要不同模型 or 不同细分任务需要不同模型参数 数据集: 1)VQA,显示图片+抽象场景:每个问题给10个不同答案:含有无图片答案(考 ...
随机推荐
- 小程序使用wxParse解析html
转载至:http://blog.csdn.net/tang05709/article/details/54924675 这个是需要循环出显示的https://github.com/tonyzhan/c ...
- js中如何通过身份证号计算出生日期和年龄
在html中有如下标签 身份证号:<input type="text" id="Gra_IDCard" onChange="IDCardChan ...
- matlab中高维数组怎么做PCA?
PCA需要先求数据的散布矩阵x*x',再求其特征向量,那么随便一个400*450的图像,就是180000维,矩阵就是180000*180000,matlab无法容纳,那么通常的PCA对图像的降维,比如 ...
- php微信公众号开发
简单的事例总结: wamp下载安装:https://sourceforge.net/projects/wampserver/ www目录里创建php文件weixin.php <?php head ...
- html盒子水平和垂直居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- laravel使用使用 Php Artisan Tinker 实现模型的增删改查
tinker命令: php artisan tinker 查阅数据库数据: App\User::count(); App\User::where('username', 'samuel')->f ...
- Python 自然语言处理笔记(一)
一. NLTK的几个常用函数 1. Concordance 实例如下: >>> text1.concordance("monstrous") Displaying ...
- Vue + Element UI 实现权限管理系统(动态加载菜单)
动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...
- tomcat启动超时_tomcat was unable to start within
参考: http://jingyan.baidu.com/article/64d05a025c9969de55f73b23.html 首先,你得确认下你的数据库连接,尤其是在多个服务器之间转换或者服务 ...
- RabbitMQ 消息应答机制(message acknowledgments)
消息应答机制是一个很重要的功能,它能保证消息队列中的某个消息是否被成功处理.如果RabbitMQ server收到Consumer端发来的应答信号,就会将Consumer刚才处理的消息删除,并发送下一 ...