精华内容
下载资源
问答
  • Res-Net: Resblock与其变体的讨论

    万次阅读 多人点赞 2019-08-16 22:18:25
    众所周知,现在很多网络都是cell组成的,最常用的就是resblock,我想好好研究研究
    众所周知,现在很多网络都是cell组成的,最常用的就是resblock,这篇文章旨在记录比较popular的resblock与其变体。

    最开始,kaiming提出resblock是为了分类问题,作为cv最基础的问题,无疑其他domain也纷纷借鉴,以resblock为cell的网络结构铺天盖地席卷而来…

    1.最开始的resblock

    resblock1

    2.resblock 进化

    BatchNorm/InstanceNorm/…Norm出现的时候,basic block最常用的就是Conv+BN+Relu+Conv+BN 模式侧边分支的模式,一定要记住的是,侧边分支最后一个一定不能是relu,残差块残差块,有正有负才能修复identity(identity就是下图灰色的箭头中的线)。
    ·在这里插入图片描述

    之后有文章对上面结构做出改进,准确的说是改变了模块顺序。得到修正后的basick block模块如下。
    在这里插入图片描述

    为什么新的结构好那?作者推导了公式(下面有推导),证明这样子在backward的时候梯度可以完全往回传导,所以这样子才是最佳的resblock。
    其次,随着BN/IN等在high-level里的活跃,dropout慢慢淡出了人们视野,毕竟都是正则,前者主流,但是仍然有人往里面增加dropout,尤其是生物医学图像数据集(更容易过拟合),所以大家把各种正则手段都拿了出来(个人愚见…)。

    2.1为什么新的block可以work?

    在kaiming的Identity Mappings in Deep Residual Networks中,有一幅图展示了哪种resblock比较好,下图是在CIFAR-10上使用1001-layer ResNets的结果。可以看到新的unit是的resnet更加容易训练。

    在这里插入图片描述

    2.2 简单的推导


    简单解释一下为什么这么做梯度不会消失。定义xLx_L是深度L层的单元,loss function是ϵ\epsilon
    在这里插入图片描述
    根据链式法则,loss function回传到第L层可以拆解成两项:
    ϵxL\frac{\partial \epsilon}{x_L}ϵxL(ϵxLi=ll1F)\frac{\partial \epsilon}{x_L} (\frac{\partial \epsilon}{x_L} \sum_{i=l}^{l-1} \mathcal {F})

    • ϵxL\frac{\partial \epsilon}{x_L}可以保证loss function可以返回第L层。
    • ϵxL(ϵxLi=ll1F)\frac{\partial \epsilon}{x_L} (\frac{\partial \epsilon}{x_L} \sum_{i=l}^{l-1} \mathcal {F})在一个mini-batch中不总是为-1。所以loss function回传到第L层的梯度不会为0。(论文没解释为什么不总是为-1,有点疑惑

    2.3 identify的重要性

    在这里插入图片描述
    还是Identity Mappings in Deep Residual Networks这个论文。kaiming尝试了不同的组合(美观期间没有画出BN)。
    这里有个非常重要的结论:identify那条线非常重要,谨慎修改,注意就连上面放一个1x1的conv都会大幅度削减error!(但是放一个1x1的conv情况下resnet34效果却有提升。。所以实验结论是block数目变多后,放一个1x1的conv在identify上效果变差)
    在这里插入图片描述
    Note:上表验证了图中6种组合的性能,实验在CIFAR-10 test set,使用了ResNet-110

    2.4 BN/ReLU的顺序?

    在这里插入图片描述
    还是Classification error (%) on the CIFAR-10 test set 。最好的方式是图中e。
    请大家务必细品上图/表!!!

    2.5 常用的特征提取模块

    一般常用的有ResNet18,ResNet34,ResNet50,ResNet101,ResNet152,这些结构经常用来进行特征提取,比如deeplabv3+encoder中就使用了ResNet101作为backbone。kaiming这几种特征提取网络,网络越深,效果自然越好。
    在这里插入图片描述
    这是原文中,分类问题的结构与网络FLOPs。一般torch等框架里包含有相应模块。

    3 ResNeXt的出现

    经历了Res-Net的成功,kaiming在2017cvpr上提出了其改进版ResNeXt(论文名:Aggregated Residual Transformations for Deep Neural Networks)。后面的四个字母是next,表示下一个的意思。

    3.1 引入cardinality(基数)

    在这里插入图片描述
    对于resnet中的bottleneck,在channel维度上进行了分组,上图中的cardinality是32,也就是分成32组channel数目更小的统一单元。细心的朋友就会发现,64 不等于 4x32啊,为什么这么分?

    因为他们的计算量是近乎相同的。(卷积核如何计算参数量,详见最近整理的一个博文——传送门

    • 左图是256 · 64+ 3 · 3 · 64 · 64+ 64 · 256 ≈ 70k
    • 右图是C · (256 · d + 3 · 3 · d · d + d · 256),C = 32 and d = 4刚好差不多70k。
      就是这么个意思。右图也是本文的核心。

    3.2 bottleneck/basicblock的改进

    1.当depth>=3的时候:

    在这里插入图片描述
    如上图,ResNeXt可以从三种角度去看,这三种是等效的我在图上有一些注释,总之请大家细品三幅图。

    2.当depth=2的时候,也就是BasicBlock:
    在这里插入图片描述
    此时,并不等效于分组卷积。因为分组卷积in_channel 和 out_channel 都必须分组,大家看图左,只有一端才分组(对比bottleneck那个图b),所以BasicBlock无法改进。

    3.3 改进后的提升

    在这里插入图片描述
    1x64d就是Res-Net的设置,32x4d就是上一章节的bottleneck设置,分成32组。

    4.之后的Dense-net

    然后就是denseblock了,其实我感觉就是连接更加dense,不同层次特征都连上,效果肯定提高了。但是这玩意显存占用就没法提了(因为有点多)
    在这里插入图片描述

    展开全文
  • 1.最开始的resblock 2.resblock 进化 2.1为什么新的block可以work? 2.2 简单的推导 2.3 identify的重要性 2.4 BN/ReLU的顺序? 2.5 常用的特征提取模块 3 ResNeXt的出现 3.1 引入cardinality(基数)...

    目录

     

    最开始,kaiming提出resblock是为了分类问题,作为cv最基础的问题,无疑其他domain也纷纷借鉴,以resblock为cell的网络结构铺天盖地席卷而来…

    1.最开始的resblock

    resblock1

    2.resblock 进化

    BatchNorm/InstanceNorm/…Norm出现的时候,basic block最常用的就是Conv+BN+Relu+Conv+BN 模式侧边分支的模式,一定要记住的是,侧边分支最后一个一定不能是relu,残差块残差块,有正有负才能修复identity(identity就是下图灰色的箭头中的线)。
    ·在这里插入图片描述

    之后有文章对上面结构做出改进,准确的说是改变了模块顺序。得到修正后的basick block模块如下。
    在这里插入图片描述

    为什么新的结构好那?作者推导了公式(下面有推导),证明这样子在backward的时候梯度可以完全往回传导,所以这样子才是最佳的resblock。
    其次,随着BN/IN等在high-level里的活跃,dropout慢慢淡出了人们视野,毕竟都是正则,前者主流,但是仍然有人往里面增加dropout,尤其是生物医学图像数据集(更容易过拟合),所以大家把各种正则手段都拿了出来(个人愚见…)。

    2.1为什么新的block可以work?

    在kaiming的Identity Mappings in Deep Residual Networks中,有一幅图展示了哪种resblock比较好,下图是在CIFAR-10上使用1001-layer ResNets的结果。可以看到新的unit是的resnet更加容易训练。

    在这里插入图片描述

    2.2 简单的推导


    简单解释一下为什么这么做梯度不会消失。定义xLx_LxL​是深度L层的单元,loss function是ϵ
    在这里插入图片描述
    根据链式法则,loss function回传到第L层可以拆解成两项:

    • ​可以保证loss function可以返回第L层。
    • 在一个mini-batch中不总是为-1。所以loss function回传到第L层的梯度不会为0。(论文没解释为什么不总是为-1,有点疑惑

    2.3 identify的重要性

    在这里插入图片描述
    还是Identity Mappings in Deep Residual Networks这个论文。kaiming尝试了不同的组合(美观期间没有画出BN)。
    这里有个非常重要的结论:identify那条线非常重要,谨慎修改,注意就连上面放一个1x1的conv都会大幅度削减error!(但是放一个1x1的conv情况下resnet34效果却有提升。。所以实验结论是block数目变多后,放一个1x1的conv在identify上效果变差)
    在这里插入图片描述
    Note:上表验证了图中6种组合的性能,实验在CIFAR-10 test set,使用了ResNet-110

    2.4 BN/ReLU的顺序?

    在这里插入图片描述
    还是Classification error (%) on the CIFAR-10 test set 。最好的方式是图中e。
    请大家务必细品上图/表!!!

    2.5 常用的特征提取模块

    一般常用的有ResNet18,ResNet34,ResNet50,ResNet101,ResNet152,这些结构经常用来进行特征提取,比如deeplabv3+encoder中就使用了ResNet101作为backbone。kaiming这几种特征提取网络,网络越深,效果自然越好。
    在这里插入图片描述
    这是原文中,分类问题的结构与网络FLOPs。一般torch等框架里包含有相应模块。

    3 ResNeXt的出现

    经历了Res-Net的成功,kaiming在2017cvpr上提出了其改进版ResNeXt(论文名:Aggregated Residual Transformations for Deep Neural Networks)。后面的四个字母是next,表示下一个的意思。

    3.1 引入cardinality(基数)

    在这里插入图片描述
    对于resnet中的bottleneck,在channel维度上进行了分组,上图中的cardinality是32,也就是分成32组channel数目更小的统一单元。细心的朋友就会发现,64 不等于 4x32啊,为什么这么分?

    因为他们的计算量是近乎相同的。(卷积核如何计算参数量,详见最近整理的一个博文——传送门

    • 左图是256 · 64+ 3 · 3 · 64 · 64+ 64 · 256 ≈ 70k
    • 右图是C · (256 · d + 3 · 3 · d · d + d · 256),C = 32 and d = 4刚好差不多70k。
      就是这么个意思。右图也是本文的核心。

    3.2 bottleneck/basicblock的改进

    1.当depth>=3的时候:

    在这里插入图片描述
    如上图,ResNeXt可以从三种角度去看,这三种是等效的我在图上有一些注释,总之请大家细品三幅图。

    2.当depth=2的时候,也就是BasicBlock:
    在这里插入图片描述
    此时,并不等效于分组卷积。因为分组卷积in_channel 和 out_channel 都必须分组,大家看图左,只有一端才分组(对比bottleneck那个图b),所以BasicBlock无法改进。

    3.3 改进后的提升

    在这里插入图片描述
    1x64d就是Res-Net的设置,32x4d就是上一章节的bottleneck设置,分成32组。

    4.之后的Dense-net

    然后就是denseblock了,其实我感觉就是连接更加dense,不同层次特征都连上,效果肯定提高了。但是这玩意显存占用就没法提了(因为有点多)
    在这里插入图片描述

    展开全文
  • 2D UNet++ ResBlock脑胶质瘤分割BraTs + Pytorch实现

    千次阅读 热门讨论 2020-04-24 04:09:58
    UNet++讲解 玖零猴:UNet++解读 + 它是如何对UNet改进 + 作者的研究态度和方式 网络结构 ... Encoder BackBone = ResBlock Decoder BackBone = VGGBlock 通道数[32, 64, 128, 256,...

    UNet++讲解

    玖零猴:UNet++解读 + 它是如何对UNet改进 + 作者的研究态度和方式

    网络结构

    v2-696a1266603294353a88b8146a7d4150_b.jpg

            Encoder BackBone = ResBlock
    Decoder BackBone = VGGBlock
    通道数[32, 64, 128, 256, 512]
          

     

    v2-f954d44d569240432afcc2ff8a94fd6a_b.jpg
    ResBlock
     
    v2-f071f137d426b2d497c7ba8a0bc99d65_b.jpg
    VGGBlock
     

    玖零猴:凯明之作Resnet + 心路历程[超详] + 解决退化问题 + 让网络变得更深成为现实

    BraTs数据准备

    数据来源

    本文用的训练集和验证集均来自BraTs2018的训练集(其中HGG:210个病人,LGG:75个病人)

    但由于BraTs只公开训练集数据,没有测试集数据,如果在训练集中再拆一部分用来作测试集的话,那训练集便少了许多,训练数据如果过少,容易出现过拟合现象,即在训练集中表现好,而在测试集中表现差,此时的网络泛化能力变差了.为了解决数据少的问题,灵机一动的我想出了一个办法.

    因为BraTs2019的训练集在BraTs2018的基础上增多了,其中HGG增加了49例,LGG增加了1例,那么我就把这些新增的作为我的测试集

    下面我提供百度云盘给大家下载,这是原始数据

            BraTs18数据集下载地址(不包含测试集,提供的验证集无GT) 
    链接:https://pan.baidu.com/s/1Ry41OVl9VLOMzhQQR9qXuA 提取码:qvmo
    BraTs19数据集下载地址如下(不包含测试集,提供的验证集无GT) 
    链接: https://pan.baidu.com/s/1S5XGTdHkwFnagKS-5vWYBg 提取码: 2333
          

    数据的预处理以及实现代码

    把上面两年的数据下下来,然后我对数据的预处理方法是链接

    完整的实现代码(jupyter notebook打开)

    https://github.com/Merofine/BraTS2Dpreprocessing

    1. GetTrainingSets.ipynb——>训练集和验证集
    2. GetTestingSetsFrom2019.ipynb-—>测试集

    代码执行完后,获得npy数据

    v2-31cb53c7a1a959205b2a5c4682bb0c2f_b.png

    <如果大家嫌麻烦,我这里提供预处理好的npy数据>

            链接:https://pan.baidu.com/s/1iIBvqrXIx2JAvoyt3FcuYw  密码:4qua
          

     

    训练集、验证集和测试集——预处理之区别

    它们的预处理除了是否要去除没有病灶切片外,别无区别

    训练集是去除的,以缓解类别不均衡问题,类别不平衡(class-imbalance)就是指分类任务中不同类别的训练样例数目差别很大的情况,但若差别很大,则会对学习过程造成困扰.我们的任务是分割,分割是一种对像素级别的分类,一个切片假如病灶很少甚至没有,那么就会出现严重的类别不均衡,学习的时候网络就会偏向于多的那一类靠,为了缓解这种情况,应该剔除没有病灶的切片

    而验证集我也是去除的,因为验证集其实在训练过程中扮演了另一角色,虽然并没有直接参与训练,可是却是为了防止过拟合现象,也就是说防止网络将这些有病灶的切片学得太过头了,这是个人理解,具体到底是否去除,还得通过实验证明

    测试集当然是不用去除的,因为这个时候就是考验它的时候到了,让它自己判断是否有病灶(提示:这里我还是去了,去了之后测出来的Dice会稳一点0.0)

    运行环境的安装

    windows10 64 bits、nvidia驱动、CUDA8.0、cudnn、anaconda

            打开命令窗口, 分别输入以下指令:
    
    conda create -n jiu0Monkey python=3.6
    
    conda activate jiu0Monkey
    
    pip install simpleitk
    
    pip install opencv-python==3.4.2.16
    
    pip install scipy
    
    pip install scikit-learn==0.20
    
    pip install scikit-image==0.14
    
    conda  install numpy  mkl cffi
    
    安装pytorch,选择与cuda版本对应的进行安装,python版本也要对应
    下载链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
    我选择的是win-64 pytorch-0.4.0-py36_cuda80_cudnn7he774522_1.tar.bz2
    下载完毕后进行安装,找到下载目录并执行:
    conda install --offline .\pytorch-0.4.0-py36_cuda80_cudnn7he774522_1.tar.bz2
    
    conda install  torchvision  -c pytorch
    
    conda install Pillow=6.1
    
    conda install tqdm
    
    conda install pandas
    
    pip install -U scikit-image
    
            
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numba
    pip install hausdorff
          

    代码下载链接

    Merofine/NestedUnet_ResBlock

    训练:

    将train.py的img_paths和mask_paths修改为自己的trainImage和trainMask的路径

    训练前会通过train_test_split函数将数据集划分为训练集和验证集,只要参数random_state一样,划分的结果就是一样的

    每一次epoch训练结束,都会对验证集进行测试Iou指标,如果比之前最好的还要好就保存本次训练模型,如果超过args.early_stop这个参数还没有训练更好的话,便结束训练,这个原理就是early_stop,主要还是防止网络训练过度,造成过拟合现象,这也就是验证集虽然没有直接参与训练,但是却在其中扮演了一个非常重要的角色!

    [过拟合]早停法 (Early Stopping)

    如果要训练Unet++,则运行下面指令

            python .\train.py --arch="ResNetUnetPlus" --dataset=“Jiu0Monkey”
          

    其它参数根据自己的情况进行配置

    预训练模型及测试数据获取途径:知乎付费咨询后可获得,训练不易,体谅下0.0

    预测:

    将test.py的img_paths和mask_paths修改为自己的testImage和testMask的路径

    运行下面指令获得测试结果以及GT文件:

            python .\test.py --name="jiu0Monkey_ResNetUnetPlus_woDS" --mode="GetPicture"
          

    想了解更多指标的信息包括Dice、Hausdorff、IOU、PPV等,可以参考我这一篇(分割常用评价指标)

    玖零猴:分割常用评价指标Dice、Hausdorff_95、IOU、PPV等(打马)

            python .\test.py --name="jiu0Monkey_ResNetUnetPlus_woDS" --mode="Calculate"
          

    运行结果:

    v2-c464e5b5ddf2f0c28ecdbd943c85e196_b.jpg

     

    v2-b97fafc668d7d17b219c051e84491989_b.jpg

     

     

    展开全文
  • 文章目录Basic BlockRes Block Basic Block Res Block


    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    Basic Block

    在这里插入图片描述

    Res Block

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Block

    2019-03-12 16:16:52
    什么是Block2.block的格式3.函数指针4.block和typedef5.Block注意事项 1.什么是Block Block是iOS中一种比较特殊的数据类型 Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛 动画 多线程 集合遍历 ...
  • 本文以ResNet18为例,分析深度残差网络的内部结构,所有的ResNet网络均先由Basic Block串接成Res Block,随后Res Block再串接成各种各样的ResNet网络。因此首先阐述什么Basic Block,然后说明什么是Res Block,最后...
  • ResUnit

    2021-03-07 15:04:17
    class Resblock(nn.Module): def __init__(self, channels, hidden_channels=None): super(Resblock, self).__init__() if hidden_channels is None: hidden_channels = channels self.block = nn.Sequentia
  • java.lang.ClassCastException: android.content.res.XmlBlock$Parser cannot be cast to android.view.animation.Animation
  • YOLOV4的网络结构

    2020-07-17 14:28:27
    yolo4的网络结构CSPDarknet53SPPPANet CSPDarknet53 … … … … … … … … SPP ...conv2D_80 的输入来自第四个Resblock_body的输出 ...conv2d_87的输入来自第三个Resblock_bod
  • resblock_body3. Darknent-534. y1、y2和y3 yoloV3网络 下面为yoloV3网络图: 为了方便理解,放了来自木盏的yoloV3的网络结构图 DBL: 即代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+...
  • 在主函数中创建模型,其中conv_relu_res_relu_block()函数生成一个网络块,经过resblock()为结构体,将block为主体循环block_num次创建网络,输入通道输出通道数分别为input_channel和output_channel。先建立block...
  • class的名称里面不能有空格,空格换成点即可。 比如下面这样就可以了 panels = browser.find_elements_by_class_name('resblock-list.post_ulog_exposure_scroll.has-results')
  • 网络结构为,conv(3,3)+residual block(N个residual block层),+conv(3,3)+upsample block.residual block:def resBlock(x,channels=64,kernel_size=[3,3],scale=1): tmp = slim.conv2d(x,channels,kernel_size,...
  • resnet block

    千次阅读 2019-06-03 14:50:55
    Sequential( (0): ResidualBlock( (left): Sequential( (0): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True...
  • Deep Speaker 详细介绍0、补充知识神经网络:卷积层:1、Deep Speaker 介绍2、ResCNN 网络结构分析ResBlock:ResCNN:一层一层的来看:解释下 dim 维度这一列3、Triplet Loss 前言:百度端到端说话人识别系统 Deep ...
  • 在掌握基本python知识之后,动手简单实践下,目标是爬取贝壳网上杭州地区的楼盘数据,只涉及楼盘名称、楼盘价格以及楼盘所在区域。...resblock_info = [] #在此爬取楼盘前50页数据 for i in range(1,51): ...
  • /text()获取指定标签下的文本内容,//text()获取指定标签下的文本内容,包括子标签下的文本内容,比较...room_infos = li.xpath('.//a[@class="resblock-room"]/span//text()').extract() room_info = '' for ...
  • 读论文TP_GAN与代码解析

    千次阅读 热门讨论 2019-01-31 12:16:38
    资源准备:论文下载, 代码下载(tensorflow实现...正脸,与普通GAN区别开的是它用两条pathway分别处理局部部位与整体,最后合成结果,整体架构如下图所示,图中省略了部分路线,resblock与部分convolution处理  ...
  • 当元素值改变的时候,在令该元素改变的事件中$("#hiddenId").change();...然后再利用 jquery事件即可获取到hiddenId的change事件$("#resblock_pic_type").on("change",function(){}); 例如: $(".d
  • res2net 测试

    千次阅读 2019-06-13 11:12:44
    这个都跑不起来。内存溢出。 https://github.com/4uiiurz1/pytorch-res2net import time import torch ...__all__ = ['ImageNetRes2Net', 'res2net50', 'res2net101', 'res2net152', 'res...
  • LevelDB源码分析之十二:block

    千次阅读 2018-01-05 12:29:36
    一.Block的存储格式 Block的种类很多,包括Data Block、Meta Block等,每个Block由三部分组成,如下图所示: 1.block data block data是具体的KV对存储区域。虽然Block有好几种,但是block data都是有序的KV...
  • 论文链接:... 代码链接:https://github.com/Res2Net/Res2Net-PretrainedModels 主要思想:主要是为了增强resnet的multi-scale的能力,以往获得the multi-scale features的方法往往都是一种l...
  • 初探swift语言的学习笔记十(block)

    万次阅读 2014-06-29 12:09:30
    swift 中block,闭包
  • block 内部结构分解

    千次阅读 2013-12-10 10:29:40
    分类: Oracle 管理 2011-06-28 10:37 590人阅读 评论(0) 收藏 举报 ...本文主要说明oracle block的物理结构,它是oracle的最小存储单元,由多个os数据块组成。主要由三个逻辑层组成(通过c语
  • RES加密解密以及签名验签 128位加密 Base64是jdk8自带的 分段式加密解密,满足超长字符串加密 代码较长请耐心 import java.io.ByteArrayOutputStream; import java.security.*; import java.security.interfaces....
  • Android DNS之发送查询报文: res_nsend()

    千次阅读 2018-09-19 22:32:03
    res_nsend() @statp: resolver状态结构 @buf:组装好的DNS查询报文 @buflen:查询报文长度 @ans:用户保存响应报文的缓存区 @anssiz:响应报文的长度 int res_nsend(res_state statp, const u_char *buf, int ...
  • Convolution综述——res2net 简介: 由南开大学,牛津大学,加州大学美熹德分校提出的一种提高网络对多尺度信息表达的方案 摘要: 对于许多视觉任务来说,在多个尺度上表示特征是非常重要的。近年来,背骨神经网络...
  • 其中函数dilated_res_block(self, feature, xyz, neigh_idx, d_out, name, is_training)就是文章对应的Dilated Residual Block模块。具体代码如下: def dilated_res_block(self, feature, xyz, neigh_idx, d_out,...
  • bluestore 中采用allocator来分配块。allocator的使用者保护bluefs和bluestore Allocator *Allocator::create(CephContext* cct, string type, int64_t size, int64_t block_size) { if (type == "...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,804
精华内容 29,921
关键字:

resblock