精华内容
下载资源
问答
  • 【深度学习】R-CNN 论文解读及个人理解

    万次阅读 多人点赞 2018-08-24 10:04:15
    本篇论文的题目是 《Rich feature hierarchies for accurate oject detection and semantic segmentation》,翻译过来就是针对高准确度的目标检测与语义分割的多特征层级,通俗地来讲就是一个用来做目标检测和语义...

    背景

    本篇论文的题目是 《Rich feature hierarchies for accurate oject detection and semantic segmentation》,翻译过来就是针对高准确度的目标检测与语义分割的多特征层级,通俗地来讲就是一个用来做目标检测和语义分割的神经网络。

    本文作者:Ross Girshick,JeffDonahue,TrevorDarrell,Jitendra Malik。

    这篇论文发布时间是 2014 年,它具有很多比较重要的意义。

    1. 在 Pascal VOC 2012 的数据集上,能够将目标检测的验证指标 mAP 提升到 53.3%,这相对于之前最好的结果提升了整整 30%.
    2. 这篇论文证明了可以讲神经网络应用在自底向上的候选区域,这样就可以进行目标分类和目标定位。
    3. 这篇论文也带来了一个观点,那就是当你缺乏大量的标注数据时,比较好的可行的手段是,进行神经网络的迁移学习,采用在其他大型数据集训练过后的神经网络,然后在小规模特定的数据集中进行 fine-tune 微调。

    什么是目标检测

    给定一张图片可以识别出类别就是,对象识别

    在这里插入图片描述
    比如,上面的图像就需要预测物体类别为 cat。

    目标检测除了要识别类别外,还要找到他们的位置。
    在这里插入图片描述

    显然,目标检测比对象识别更难。

    R-CNN 在前人的肩膀上前行

    在过去的十多年时间里,传统的机器视觉领域,通常采用特征描述子来应对目标识别任务,这些特征描述子最常见的就是 SIFT 和 HOG.而 OpenCV 有现成的 API 可供大家实现相关的操作。

    SIFT 和 HOG 的王者地位最近被卷积神经网络撼动。

    2012 年 Krizhevsky 等人在 ImageNet 举办的 ILSVRC 目标识别挑战大赛中一战成名,豪夺当年的第一名,Top5 错误率 15%,而他们团队提出来的网络结构以他们的导师名字命名,它就是 AlexNet。

    在这里插入图片描述

    它有 5 层卷积层,2 层全连接层。

    因为 AlexNet 的出现,世人的目光重回神经网络领域,以此为契机,不断涌出各种各样的网络比如 VGG、GoogleNet、ResNet 等等。

    受 AlexNet 启发,论文作者尝试将 AlexNet 在 ImageNet 目标识别的能力泛化到 PASCAL VOC 目标检测上面来。

    但一切开始之前,需要解决两个主要的问题。

    1. 如何利用深度的神经网络去做目标的定位?
    2. 如何在一个小规模的数据集上训练能力强劲的网络模型?

    论文作者给出了思路。

    利用候选区域与 CNN 结合做目标定位

    借鉴了滑动窗口思想,R-CNN 采用对区域进行识别的方案。

    具体是:

    1. 给定一张输入图片,从图片中提取 2000 个类别独立的候选区域。
    2. 对于每个区域利用 CNN 抽取一个固定长度的特征向量。
    3. 再对每个区域利用 SVM 进行目标分类。

    下面的图像来自论文本身。

    在这里插入图片描述

    利用预训练与微调解决标注数据缺乏的问题

    采用在 ImageNet 上已经训练好的模型,然后在 PASCAL VOC 数据集上进行 fine-tune。

    因为 ImageNet 的图像高达几百万张,利用卷积神经网络充分学习浅层的特征,然后在小规模数据集做规模化训练,从而可以达到好的效果。

    现在,我们称之为迁移学习,是必不可少的一种技能。

    R-CNN 的目标识别之路

    前面内容提到过,R-CNN 系统分为 3 个阶段,反应到架构上由 3 个模块完成。

    1. 生产类别独立的候选区域,这些候选区域其中包含了 R-CNN 最终定位的结果。
    2. 神经网络去针对每个候选区域提取固定长度的特征向量。
    3. 一系列的 SVM 分类器。

    候选区域

    能够生成候选区域的方法很多,比如:

    • objectness
    • selective search
    • category-independen object proposals
    • constrained parametric min-cuts(CPMC)
    • multi-scale combinatorial grouping
    • Ciresan

    R-CNN 采用的是 Selective Search 算法。

    特征抽取

    R-CNN 抽取了一个 4096 维的特征向量,采用的是 Alexnet,基于 Caffe 进行代码开发。

    需要注意的是 Alextnet 的输入图像大小是 227x227。

    而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227*227 的尺寸。

    有一个细节,在对 Region 进行变换的时候,首先对这些区域进行膨胀处理,在其 box 周围附加了 p 个像素,也就是人为添加了边框,在这里 p=16。

    测试阶段的目标检测

    在测试阶段,R-CNN 在每张图片上抽取近 2000 个候选区域。

    然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用 SVM 进行类别的识别,并产生分数。

    候选区域有 2000 个,所以很多会进行重叠。

    针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。

    运行时分析

    两个因素可以让目标识别变得高效。

    1. CNN 的参数是所有类别共享的。
    2. R-CNN 生成的特征向量维度较少。论文拿应用在 UVA 采用的空间金字塔技术相比,它们生成的特征维度是 360k,而 R-cnn 就 4K 多。

    也就是运行过程中,参数变少了,所以比传统的高效。

    体现在提取特征的时间,如果用 GPU ,13s/张,CPU 53s/张。

    R-cnn 能够处理 100k 种类别,在一个多核的 CPU 上只要花费 10 多秒。

    与 UVA 相比,如果处理 100k 个预测,需要 134GB 内存空间,而 R-CNN 只要 1.5GB。

    训练

    前面已经提到过 R-CNN 采取迁移学习。

    提取在 ILSVRC 2012 的模型和权重,然后在 VOC 上进行 fine-tune。

    需要注意的是,这里在 ImageNet 上训练的是模型识别物体类型的能力,而不是预测 bbox 位置的能力。

    ImageNet 的训练当中需要预测 1000 个类别,而 R-CNN 在 VOC 上进行迁移学习时,神经网络只需要识别 21 个类别。这是 VOC 规定的 20 个类别加上背景这个类别。

    R-CNN 将候选区域与 GroundTrue 中的 box 标签相比较,如果 IoU > 0.5,说明两个对象重叠的位置比较多,于是就可以认为这个候选区域是 Positive,否则就是 Negetive.

    训练策略是:采用 SGD 训练,初始学习率为 0.001,mini-batch 大小为 128.

    对象识别相关

    通常对待一个二值化的分类器,它的结果只要 2 中,Positive 和 Negetive。

    比如,有一个汽车分类器,它可以轻松地确认,一个方框里面包含了一辆汽车,那么它肯定就是 Positive。

    也可以很清楚地确认,如果一个背景方框中没有包含汽车,那么它就是 Negetive。

    但是,比较难确认的是,如果一个方框,只有一部分与汽车重叠,那么如何标注这个方框呢?

    R-CNN 采用的是 IoU 的阈值,这个 threshold 取 0.3,如果一个区域与 Ground tureth 的 IoU 值低于设定的阈值,那么可以讲它看成是 Negetive.

    IoU 的 threshold 它不是作者胡乱取值的,而是来自 {0,0.1,0.2,0.3,0.4,0.5} 的数值组合的。

    而且,这个数值至关重要,如果 threshold 取值为 0.5,mAP 指标直接下降 5 个点,如果取值为 0,mAP 下降 4 个点。

    一旦特征抽取成功,R-CNN 会用 SVM 去识别每个区域的类别,但这需要优化。

    因为训练的数据太大,不可能一下子填充到电脑内存当中,R-CNN 作者采取了一种叫做 Hard negetive mining 的手段。

    R-CNN 的在 PASCAL-VOC 2010-12 的表现

    R-CNN 是在 PASCAL VOC 2012 进行最终的 fine-tune,也是在 VOC 2012 的训练集上优化 SVM.

    然后,还与当时 4 个强劲的对手,也就是 4 个不同的目标检测算法进行了比较。

    在这里插入图片描述

    值得关注的是,上面表格中 UVA 检测系统也采取了相同的候选区域算法,但 R-CNN 的表现要好于它。

    可视化、框架精简和错误检测

    我们都知道,在卷积神经网络中,第一层可以直接用来显示,而且肉眼可视,通常他们是为了捕捉物体边缘,及突出的颜色信息,但越往后的卷积层越抽象,这个时候进行可视化就是一个挑战了。

    Zeiler 和 Fergus 提出了一种基于反卷积手段的可视化研究,但 R-CNN 的作者直接提供了一个没有参数的方法,简单直接。

    思路是挑选一个特征出来,把它直接当成一个物体分类器,然后计算它们处理不同的候选区域时,activation 的值,这个值代表了特征对这块区域的响应情况,然后将 activation 作为分数排名,取前几位,然后显示这些候选区域,自然也可以清楚明白,这个 feature 大概是什么。

    R-CNN 作者将 pool5 作为可视化对象,它的 feature map 是 6x6x255 的规格,可以理解为有 256 个小方块,每个方块对应一个特征。

    下面的图表中显示了这以可视化的效果,这里只显示了 256 个特征中的 6 个,每个特征取 activation 值最高的 16 个区域。

    在这里插入图片描述

    上图应该很明白了,对于同一类特征,activation 相差不大,这也是卷积神经网络能够准确识别物体的直观体现。

    框架精简

    AlexNet 有 7 层,那么那些层是关键指标呢?哪些层可有可无呢?

    在这里插入图片描述

    pool5 在上一小节已经讨论过了,那么 fc6 和 f7 就成了研究的对象。

    fc6 与 pool5 构成全连接,为了计算 feature 它会乘以一个 4096x9216 的权重矩阵,然后在与一组 bias 相加,所以它有 3700 多万的参数。

    fc7 是最后一层,它的权重矩阵是 4096x409,它的参数有 1678 万多的参数。

    但经过作者在 PASCAL 上不做 fine-tune 处理,直接测试,可以发现 fc7 的意义没有 fc6 大,甚至移除它之后,对于 mAP 结果指标没有影响。

    移除 fc7 就表示可以减少将近 1800 万个参数。

    更惊喜的事情是,同时移除 fc6 和 fc7 并没有多大的损失,甚至结果还要好一点点。

    所以,神经网络最神奇的力量来自卷积层,而不是全连接层。

    上面说的是没有 fine-tune 的情况,那么在 fine-tune 的情况是什么呢?

    结果证明,fine-tune 后 fc6 与 fc7 提升的效果明显。

    所以结论就是,pool5 从 ImageNet 训练集中学习了物体的泛化能力,而能力的提升则是通过特定领域的 fine-tune。

    举个例子,神经网络在 ImageNet 数据集中学习到了 100 种猫的特征,而我自己的数据集只有两种猫,经过 fine-tune 训练后,这个神经网络可以更准确识别这两种猫了。

    R-CNN 还与其他的特征方法进行了能力比较,作者选取了两种基于 DPM 的方法,DPM ST 和 DPM HSC,结果都证明,R-CNN 要好于它们。

    目标检测错误分析

    R-CNN 作者采用了 Hoiem 提出的目标检测分析工具,能够直观地揭露错误的模型,作者通过这个工具针对性地进行 fine-tune。

    bbox 回归

    bbox 的值其实就是物体方框的位置,预测它就是回归问题,而不是分类问题。

    受 DPM 的启发,作者训练了一个线性的回归模型,这个模型能够针对候选区域的 pool5 数据预测一个新的 box 位置。具体细节,作者放在补充材料当中。

    语义分割

    什么是语义分割?

    在这里插入图片描述

    区域分类技术是语义分割的标准做法,所以 R-CNN 也可以做语义分割,并且作者拿它跟 O2P 来比较。

    R-CNN 进行语义分割分为 3 个阶段。

    1. 利用 CPMC 生成候选区域,然后将这些区域调整大小为 227x227,送到神经网络当中,这是 full 阶段,区域中有背景也有前景。
    2. 这个阶段只处理候选区域的前景,将背景用输入的平均值代替,然后背景就变成了 0 ,这个阶段称为 fg。
    3. full + fg 阶段,将背景和前景简单拼接。

    回顾

    • R-CNN 采用 AlexNet
    • R-CNN 采用 Selective Search 技术生成 Region Proposal.
    • R-CNN 在 ImageNet 上先进行预训练,然后利用成熟的权重参数在 PASCAL VOC 数据集上进行 fine-tune
    • R-CNN 用 CNN 抽取特征,然后用一系列的的 SVM 做类别预测。
    • R-CNN 的 bbox 位置回归基于 DPM 的灵感,自己训练了一个线性回归模型。
    • R-CNN 的语义分割采用 CPMC 生成 Region

    R-CNN 灵活地运用了现有比较先进的工具和技术,并充分吸收,根据自己的逻辑改造,最终取得了很大的进步。

    到 2018 年,R-CNN 已经不是最先进的目标检测模型,也不是最先进的语义分割模型,但这篇论文最大意义在于展示了作者在资源匮乏的情况下如何整合现有的先进技术去解决自己问题的手段。

    除了R-CNN 外,还有一些很优秀的目标检测算法,我个人钟爱 YOLO,有兴趣的同学可以看看这篇。
    《死磕YOLO系列,YOLOv1 的大脑、躯干和手脚》

    展开全文
  • SSD论文解读

    2021-01-06 20:39:08
    SSD(SingleShotDetector)论文解读 一、相关背景 速率问题:在目标检测的速率上明显存在问题,此前最快的检测模型为Faster R-CNN(速率为每秒钟7帧) 二、主要贡献 提出了第一个基于目标检测的深度神经网络,不需要...
  • RAdam论文解读

    千次阅读 2019-08-17 17:48:24
    论文解读:Radam:ON THE VARIANCE OF THE ADAPTIVE LEARNING RATE AND BEYOND 上面的了链接是对论文的解读,这里只是我个人的理解。 1,目的 想找到一个比较好的优化器,能够在收敛速度和收敛的效果上都比较号...

    中国博士生提出最先进AI训练优化器,收敛快精度高,网友亲测:Adam可以退休了

    论文解读:Radam:ON THE VARIANCE OF THE ADAPTIVE LEARNING RATE AND BEYOND
    上面的了链接是对论文的解读,这里只是我个人的理解。

    1,目的

    • 想找到一个比较好的优化器,能够在收敛速度和收敛的效果上都比较号。
    • 目前sgd收敛较好,但是慢。
    • adam收敛快,但是容易收敛到局部解。
    • 常用解决adam收敛问题的方法是,自适应启动方法。

    2,adam方法的问题

    • adam在训练的初期,学习率的方差较大。
    • 根本原因是因为缺少数据,导致方差大。
    • 学习率的方差大,本质上自适应率的方差大。
    • 可以控制自适应率的方差来改变效果。

    3,Radam,控制自适应率的方差

    • 一堆数学公式估计出自适应率的最大值和变化过程。
    • 提出了Radam的优化过程

    4,实验结论

    • 前几个周期内整流项使得RAdam比Adam方法慢,但是在后期的收敛速度是比Adam要更快的。
    • 尽管RAdam在测试精度方面未能超越SGD,但它可以带来更好的训练性能。
    • RAdam算法对初始学习率是具有鲁棒性的,可以适应更宽范围内的变化。在从0.003到0.1一个很宽的范围内,RAdam表现出了一致的性能,训练曲线末端高度重合
    • 如果你以为RAdam只能处理较小数据集上的训练,或者只有在CNN上有较好的表现就大错特错了。即使大道有几十亿个单词的数据集的LSTM模型,RAdam依然有比Adam更好的表现。

    5,个人理解

    • 优势:鲁棒性强,这个优势很强,而且适合任何模型的初期的实验,也对新手比较友好;不用调试学习率,这个优势也很强;自适应启动的方式会增加超参数,不适合初期的实验。
    • 缺点:论文也提出,他的收敛效果不一定是所有里面最好的。所以在实验的后期,对于老手,可以采用更加精细的学习率控制策略试试会不会拿到另一个好的结果。
    展开全文
  • 初中语文语文论文解读新课标
  • 初中语文语文论文解读合作学习
  • ATSS论文解读

    千次阅读 2019-12-30 10:40:54
    ATSS论文解读链接文章创新点详细解读合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个...

    链接

    论文地址:Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection
    github地址:ATSS

    文章创新点

    本文主要是通过对目标检测中的正样本的重新定义,通过重新定义的正样本来训练模型,最终使得模型能更好的学习到主要的特征。所以无需对模型本身做任何的修改,也无需对训练过程进行任何修改,只需调整输入到模型中的样本。

    详细解读

    论文主要阐述了对于正负样本的定义和选取对模型最终效果的影响。
    首先是对比了anchor_free和anchor_base在选取样本时的差异,本文以RetinaNet和FCOS作为例子进行了对比,RetinaNet是采用IOU去选取正负样本,FCOS是基于空间分布对正负样本进行score。这两种采样方式会导致最终训练的正负样本是不一致的,作者通过对ReinaNet用两种不同采样方式进行训练模型,并对比起在COCO上的AP,验证anchor_base和anchor_free本质上的区别只是在于采样的不同。

    regressionBoxPoint
    Intersection over Union37.036.9
    Spatial and Scale Constraint37.837.8

    然后提出本文的思想,自适应的选取正样本的方法,同时结合了上述两种的选取正样本方法,具体方法如下:
    1.对于每个输出的检测层,选计算每个anchor的中心点和目标的中心点的距离,选取K个anchor中心点离目标中心点最近的anchor为候选正样本(candidate positive samples)
    2.计算每个候选正样本和groundtruth之间的IOU,计算这组IOU的均值和方差
    3.根据方差和均值,设置选取正样本的阈值:t=m+g m为均值,g为方差。
    4.根据每一层的t从其候选正样本中选出真正需要加入训练的正样本。
    5.训练模型。

    本文的方法主要有两大特性:
    1.保证了所有的正样本anchor都是在groundtruth的周围。
    2.最主要是根据不同层的特性对不同层的正样本的阈值进行了微调。

    作者采用本方法与之前的提取正负样本的训练方法进行了对比
    在这里插入图片描述
    (未完待续)

    展开全文
  • Unet论文解读代码解读

    千次阅读 2019-02-24 14:16:26
    论文解读 网络   架构: a。U-net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少的训练图像就得到很精确的分割结果 .b。添加上采样阶段,并且添加了很多的特征通道,允许更多的原...

    论文地址:http//www.arxiv.org/pdf/1505.04597.pdf

    论文解读

    网络

     

    架构:
    a。U-net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少的训练图像就得到很精确的分割结果
    .b。添加上采样阶段,并且添加了很多的特征通道,允许更多的原图像纹理的信息在高分辨率的层中进行传播
    。U型网没有FC层,且全程使用有效的来进行卷积,这样的话可以保证分割的结果都是基于没有缺失的上下文特征得到的,因此输入输出的图像尺寸不太一样(但是在keras上代码做的都是相同的卷积),对于图像很大的输入,可以使用overlap-strategy来进行无缝的图像输出。

     

    平铺策略

     

    d。为了预测输入图像的边缘部分,通过镜像输入图像来外推丢失的上下文(不懂),实则输入大图像也是可以的,但是这个策略基于GPU内存不够的情况下所提出的
    .e。细胞分割的另外一个难点在于将相同类别和互相接触的细胞分开,因此作者提出了加权损失,也就是赋予相互接触的两个细胞之间的背景标签更高的权重。

     

    加权损失

    代码解读

    代码来源:https//github.com/jakeret/tf_unet

    初始化weights 和 bias

    
    def weight_variable(shape, stddev=0.1, name="weight"):
        initial = tf.truncated_normal(shape, stddev=stddev)
        return tf.Variable(initial, name=name)
    
    def weight_variable_devonc(shape, stddev=0.1, name="weight_devonc"):
        return tf.Variable(tf.truncated_normal(shape, stddev=stddev), name=name)
    
    def bias_variable(shape, name="bias"):
        initial = tf.constant(0.1, shape=shape)
        return tf.Variable(initial, name=name)
    

    创建卷积层和池化层
    这里的填充使用的是VALID,和论文里面所指出的是一样的.deconv2d是反卷积,也就是上采样,以第一个上采样为例,输如的X的形状为[无,28,28, 1024],则输出的形状为[无,52,52,512]。反卷积的计算细节参考https://blog.csdn.net/nijiayan123/article/details/79416764

    
    def conv2d(x, W, b, keep_prob_):
        with tf.name_scope("conv2d"):
            conv_2d = tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='VALID')
            conv_2d_b = tf.nn.bias_add(conv_2d, b)
            return tf.nn.dropout(conv_2d_b, keep_prob_)
    
    def deconv2d(x, W,stride):
        with tf.name_scope("deconv2d"):
            x_shape = tf.shape(x)
            output_shape = tf.stack([x_shape[0], x_shape[1]*2, x_shape[2]*2, x_shape[3]//2])
            return tf.nn.conv2d_transpose(x, W, output_shape, strides=[1, stride, stride, 1], padding='VALID', name="conv2d_transpose")
    
    def max_pool(x,n):
        return tf.nn.max_pool(x, ksize=[1, n, n, 1], strides=[1, n, n, 1], padding='VALID')
    

    连接前面部分的池化层和后面的反卷积层

    
    def crop_and_concat(x1,x2):
        with tf.name_scope("crop_and_concat"):
            x1_shape = tf.shape(x1)
            x2_shape = tf.shape(x2)
            # offsets for the top left corner of the crop
            offsets = [0, (x1_shape[1] - x2_shape[1]) // 2, (x1_shape[2] - x2_shape[2]) // 2, 0]
            size = [-1, x2_shape[1], x2_shape[2], -1]
            x1_crop = tf.slice(x1, offsets, size)
            return tf.concat([x1_crop, x2], 3)
    

    计算pixel-wise softmax和cross entropy
    注意到这里一个像素相当于一个预测目标,在通常的分类任务中,最后输出结果通常都是一个一维向量[1,class_nums],然后取SOFTMAX运算后得分最高的类标签。在这里,最后输出结果是一个三维向量[width,height,class_nums],每一个像素都要单独进行标签的预测,故叫像素的softmax。

    
    def pixel_wise_softmax(output_map):
        with tf.name_scope("pixel_wise_softmax"):
            max_axis = tf.reduce_max(output_map, axis=3, keepdims=True)
            exponential_map = tf.exp(output_map - max_axis)
            normalize = tf.reduce_sum(exponential_map, axis=3, keepdims=True)
            return exponential_map / normalize
    
    def cross_entropy(y_,output_map):
        return -tf.reduce_mean(y_*tf.log(tf.clip_by_value(output_map,1e-10,1.0)), name="cross_entropy")
    
    1. unet
      网络分为四个主要部分:预处理,向下卷积,向上卷积,输出映射
      preprocessing
    
    def create_conv_net(x, keep_prob, channels, n_class, layers=3, features_root=16, filter_size=3, pool_size=2,
                        summaries=True):
        """
        Creates a new convolutional unet for the given parametrization.
        :param x: input tensor, shape [?,nx,ny,channels]
        :param keep_prob: dropout probability tensor
        :param channels: number of channels in the input image
        :param n_class: number of output labels
        :param layers: number of layers in the net
        :param features_root: number of features in the first layer
        :param filter_size: size of the convolution filter
        :param pool_size: size of the max pooling operation
        :param summaries: Flag if summaries should be created
        """
    
        logging.info(
            "Layers {layers}, features {features}, filter size {filter_size}x{filter_size}, pool size: {pool_size}x{pool_size}".format(
                layers=layers,
                features=features_root,
                filter_size=filter_size,
                pool_size=pool_size))
    
        # Placeholder for the input image
        with tf.name_scope("preprocessing"):
            nx = tf.shape(x)[1]
            ny = tf.shape(x)[2]
            x_image = tf.reshape(x, tf.stack([-1, nx, ny, channels]))
            in_node = x_image
            batch_size = tf.shape(x_image)[0]
    
        weights = []
        biases = []
        convs = []
        pools = OrderedDict()
        deconv = OrderedDict()
        dw_h_convs = OrderedDict()
        up_h_convs = OrderedDict()
    
        in_size = 1000
        size = in_size
    

    down convolution
    层= 3,有三次下卷积层,一个下卷积层实际包括两次下卷积和一次汇集。

    
        # down layers
        for layer in range(0, layers):
            with tf.name_scope("down_conv_{}".format(str(layer))):
                features = 2 ** layer * features_root
                stddev = np.sqrt(2 / (filter_size ** 2 * features))
                if layer == 0:
                    w1 = weight_variable([filter_size, filter_size, channels, features], stddev, name="w1")
                else:
                    w1 = weight_variable([filter_size, filter_size, features // 2, features], stddev, name="w1")
    
                w2 = weight_variable([filter_size, filter_size, features, features], stddev, name="w2")
                b1 = bias_variable([features], name="b1")
                b2 = bias_variable([features], name="b2")
    
                conv1 = conv2d(in_node, w1, b1, keep_prob)
                tmp_h_conv = tf.nn.relu(conv1)
                conv2 = conv2d(tmp_h_conv, w2, b2, keep_prob)
                dw_h_convs[layer] = tf.nn.relu(conv2)
    
                weights.append((w1, w2))
                biases.append((b1, b2))
                convs.append((conv1, conv2))
    
                size -= 4
                if layer < layers - 1:
                    pools[layer] = max_pool(dw_h_convs[layer], pool_size)
                    in_node = pools[layer]
                    size /= 2
    
        in_node = dw_h_convs[layers - 1]
    

    up convolution
    层= 3,有三次反卷积层,一个反卷积层实际包括一个反卷积,一个连接操作和两次下卷积。

    
        # up layers
        for layer in range(layers - 2, -1, -1):
            with tf.name_scope("up_conv_{}".format(str(layer))):
                features = 2 ** (layer + 1) * features_root
                stddev = np.sqrt(2 / (filter_size ** 2 * features))
    
                wd = weight_variable_devonc([pool_size, pool_size, features // 2, features], stddev, name="wd")
                bd = bias_variable([features // 2], name="bd")
                h_deconv = tf.nn.relu(deconv2d(in_node, wd, pool_size) + bd)
                h_deconv_concat = crop_and_concat(dw_h_convs[layer], h_deconv)
                deconv[layer] = h_deconv_concat
    
                w1 = weight_variable([filter_size, filter_size, features, features // 2], stddev, name="w1")
                w2 = weight_variable([filter_size, filter_size, features // 2, features // 2], stddev, name="w2")
                b1 = bias_variable([features // 2], name="b1")
                b2 = bias_variable([features // 2], name="b2")
    
                conv1 = conv2d(h_deconv_concat, w1, b1, keep_prob)
                h_conv = tf.nn.relu(conv1)
                conv2 = conv2d(h_conv, w2, b2, keep_prob)
                in_node = tf.nn.relu(conv2)
                up_h_convs[layer] = in_node
    
                weights.append((w1, w2))
                biases.append((b1, b2))
                convs.append((conv1, conv2))
    
                size *= 2
                size -= 4
    

    Output Map

    
        # Output Map
        with tf.name_scope("output_map"):
            weight = weight_variable([1, 1, features_root, n_class], stddev)
            bias = bias_variable([n_class], name="bias")
            conv = conv2d(in_node, weight, bias, tf.constant(1.0))
            output_map = tf.nn.relu(conv)
            up_h_convs["out"] = output_map
    
        if summaries:
            with tf.name_scope("summaries"):
                for i, (c1, c2) in enumerate(convs):
                    tf.summary.image('summary_conv_%02d_01' % i, get_image_summary(c1))
                    tf.summary.image('summary_conv_%02d_02' % i, get_image_summary(c2))
    
                for k in pools.keys():
                    tf.summary.image('summary_pool_%02d' % k, get_image_summary(pools[k]))
    
                for k in deconv.keys():
                    tf.summary.image('summary_deconv_concat_%02d' % k, get_image_summary(deconv[k]))
    
                for k in dw_h_convs.keys():
                    tf.summary.histogram("dw_convolution_%02d" % k + '/activations', dw_h_convs[k])
    
                for k in up_h_convs.keys():
                    tf.summary.histogram("up_convolution_%s" % k + '/activations', up_h_convs[k])
    
        variables = []
        for w1, w2 in weights:
            variables.append(w1)
            variables.append(w2)
    
        for b1, b2 in biases:
            variables.append(b1)
            variables.append(b2)
    
        return output_map, variables, int(in_size - size)
    

    小礼物走一走,来简书关注我



    作者:golfgang
    链接:https://www.jianshu.com/p/f9b0c2c74488
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    展开全文
  • CNN论文解读

    千次阅读 2019-03-20 21:00:57
    论文解读 论文:ImageNet Classification with Deep Convolutional Neural Networks 论文连接:点击打开链接,百度网盘:点击打开链接 翻译如下: 摘要: 我们训练了一个大型的深层卷积神经网络来对120万个进行...
  • 对AlexNet的论文解读

    2017-12-28 12:08:50
    我自己写的对AlexNet的论文解读的pdf版本。对应自己的相应博客
  • centerloss的论文解读

    千次阅读 2017-09-18 22:02:36
    centerloss的论文解读
  • 论文解读: Double DIP

    千次阅读 2020-04-08 21:14:32
    论文解读:Double-DIP” : Unsupervised Image Decomposition via Coupled Deep-Image-Priors Unsupervised Image Decomposition via Coupled Deep-Image-Priors) 之前介绍过一篇非常有意思的论文,deep image prior...
  • AcGan论文解读及Keras实现-附件资源
  • ORB-SLAM3论文解读

    千次阅读 多人点赞 2020-07-27 11:59:24
    ORB-SLAM3论文解读ORB-SLAM3论文解读主要的创新点数据关联模型系统整体 ORB-SLAM3论文解读 ORB-SLAM1和2的作者Juan已经毕业了,其工作仍然由同一课题组的Carlos继续完成并撰写论文和代码,这次论文同样对应着开源...
  • CTPN论文解读

    千次阅读 2018-09-28 17:27:34
    CTPN论文解读 https://zhuanlan.zhihu.com/p/31915483 http://slade-ruan.me/2017/10/22/text-detection-ctpn/ 1. 区别 本文工作基于faster RCNN , 区别在于 改进了rpn,anchor产生的window的宽度固定为3。 ...
  • 论文解读论文解读2 论文解读3
  • OHEM论文解读

    千次阅读 2018-02-10 17:26:50
    参考:... Training Region-based Object Detectors with Online Hard Example Mining论文解读: 在FRCN中,定义background roi为和任意gt box的IOU在[bg_lo,0.5)的region propo...
  • 初中语文语文论文解读阅读评价改善阅读教学
  • 医学图像配准中的深度学习综述论文解读
  • DLA论文解读

    千次阅读 2020-10-22 14:53:12
    解读DLA这篇论文,这是卷积神经网络结构变迁过程中里程碑式的成果。
  • openpose论文解读_思维导图.pdf https://blog.csdn.net/Lininggggggg/article/details/106482726
  • 深度学习论文解读

    2020-09-14 11:20:23
    本课程主要以时间线为基础,详细讲解深度学习领域最重要的一些论文,例如: ReLU,Dropout,AlexNet,VGGNet,Batch Normalization,ResNet,Inception系列,ResNeXt,SENet,GPT-3等
  • 文章为对attention is all you need的论文解读,详细的剖析了该文章的思想。
  • 初中语文语文论文解读爱情感悟人生__兼谈引导高中学生解读爱情题材的作品
  • ICCV 2017 论文解读集锦

    2019-06-06 17:23:43
    元学习论文总结||小样本学习论文总结 2017-2019年计算机视觉顶会文章收录 ...之前我们整理过视觉顶会CVPR2017的论文解读文章和NIPS 2017 论文解读集锦,ICCV2017已经结束一段时间了,为了能够让大家更深刻了解ICC...
  • PointNet论文解读

    千次阅读 2019-04-16 21:57:04
    论文解读分两次完成,先更新一部分理论解读,实验部分后期会补上。笔者不才,欢迎各位大佬斧正,共同进步! 一、研究问题背景的综述 作者从两方面入手介绍的这篇文章。首先,作者介绍了诸位学者们针对点云的...
  • YOLOV3论文解读与应用

    2020-07-22 14:15:30
    YOLOV3论文解读与应用mobilenetv1论文地址:参考博客:模型特点:优点缺点mobilenetv2论文地址:参考博客:模型特点:mobilenetv3论文地址:参考博客:模型特点:参考博客深度学习MobileNet——深刻解读MobileNet网络结构 ...
  • Learning Linear Transformations for Fast Arbitrary Style Transfer论文解读

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,472
精华内容 15,388
关键字:

论文解读