unet神经网络(unet神经网络)
本篇文章给大家谈谈unet神经网络,以及unet神经网络对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、自然和医学图像的深度语义分割:网络结构
- 2、肝脏肿瘤分割方法
- 3、unet模型属于哪种神经网络
- 4、第五天 综述笔记2 10大类基于深度学习的segmentation model
- 5、AI面试题第二弹(神经网络基础)
- 6、U-Net实现语音分离的代码分析
自然和医学图像的深度语义分割:网络结构
原文链接:
一、写在前面:
网络架构的设计主要是基于 CNN 结构延伸出来的。主要的改进方式有两点:新神经架构的设计(不同深度,宽度,连接性或者拓扑结构)或设计新的组件(或者层)。下面我们逐个去分析了解。
本文涉及到的论文范围如下图:
二、网络架构的改进
2.1.1 FCN
传统的 CNN 分割,为了对一个像素分类,使用该像素周围的一个图像块作为 CNN 的输入用于训练和预测。缺点很卖基多:比如存储开销大,计算效率低,像素块大小也限制了感知域的大小。基于存在的这些问题,由 Long 等人在 2015 年提出的 FCN 结构,第一个全卷积神经网络的语义分割模中衡谨型。我们要了解到的是,FCN 是基于 VGG 和 AlexNet 网络上进行预训练,然后将最后两层全连接层改为的卷积层。
FCN 具体处理过程是怎么样的?从 pool1 开始,每个 pool 后图像都会变为上个池化后图像的 1/2。Pool1 为原图的 1/2,以拦明此类推,pool5 后为原图的 1/2^5,conv6,和 conv7 之后的图像保持不变,进行 stride=32 的反卷积,得到 FCN-32s。也就是直接对 pool5 进行 32 倍上采样获得 32 upsampled feature,再对 32 upsampled feature 每个点做 softmax prediction,就可以获得 32*upsampled prediction(分割图)。
FCN 这三个创新点有哪些? 全卷积 :用于解决逐像素的预测问题。通过将基础网络最后面几个全连接层换成卷积层,可实现任意大小的图像输入,并且输入图像大小与输入相对应。 反卷积 :端到端的像素级语义分割需要输出大小和输入图像大小一致。但是传统的 conv+pooling 结构会缩小图片尺寸。基于此作者引入反卷积(deconvolution)操作,对缩小后的特征进行上采样,恢复原始图像大小。 跳跃结构 :语义分割包括语义识别和目标定位。卷积网络的高层特征图可以有效的反应语义信息,而低层特征图可以有效反应目标的位置信息。语义分割任务同时进行语义识别和目标定位。作者提出的跨层连接结构(skip architecture),将低层的目标位置信息和高层语义信息进行融合,以此来提升语义分割性能。在此基础上进行 2 倍采样,2 倍 upsample 之后与 pool4 的像素点相加,进行 stride=16 的 upsample,为此 FCN-16s,重复上面类似的步骤,得到 FCN-8s。
了解到以上信息,应该对 FCN 有个整体的认识了。还有一些细节部分,比如 FCN 采用的简单的 softmax 分类损失函数,采用双线性差值 + 反卷积进行上采样,在微调的时候没有采用类别平衡策略。分割结果来看,FCN-8sFCN-16sFCN-32s。也就是说使用多层特征融合有利于提高分割准确性。
2.1.2 SegNet
SegNet 主要动机是在场景理解 。它在设计的时候考虑的是预测期间保证内存和计算时间上的效率。其中,SegNet 和 FCN 有很多相似之处,编码网络使用 VGG16 的前 13 层卷积;移除全连接;解码器使用从相应的编码器的 max-pooling indices 进行 upsampling。
对比 SegNet 和 FCN 实现 Decoder 的过程。FCN 是利用双线性插值初始化的反卷积进行上采样。而 SegNet 则是在每次 pooling 时,都存下最大值的位置,在 upsample 时将 input 值直接赋给相应的位置,其他位置的值置零。
2.1.3 U-Net
接下来,我们需要了解的是 U-Net。U-net 网络架构,由收缩路径(contracting path)和扩展路径(expanding path)组成。每一层使用两个 3 乘 3 的 conv kernel,每次卷积都进行 Relu 和 stride=2 的 maxpooling 进行下采样。四次操作后输出结果称之为 feature map。
2 乘 2 的反卷积,上采样,通道数减半,并将左边对称位置的 feature map copy 到右边进行 concate 操作,来融合下采样的浅层位置信息和高层语义信息。合并后在进行 3*3 的卷积操作。最后 output 之前,通道数表示分类的类别产生 N 类分割结果,最后选择出概率值最大的分割结果,作为最后的分割图。
U-Net 中常常会问为什么适用于医学图像这个问题.。首先分析医学影像数据特点:图像语义较为简单,结构较为固定:都是一个固定的器官的成像。而且器官本身结构固定,语义信息没有特别丰富,所以高级语义信息和低级特征都非常重要。(U-net 的 skip connection 可以解决这个问题);数据量少:医学影像的数据较难获取,为了防止过拟合,设计的模型不宜过大;多模态:医学影像是具有多种模态的;可解释性:医生需要进一步指导病灶在哪一层,哪一层的哪个位置,分割结果能求体积么?而且 U-Net 在自然图像分割也取得了不错的效果。
需要注意的一点:Unet 融合浅层信息是 maxpooling 之前还是之后的结果?是 maxpooling 之前的结果。因为 Maxpooling 之后会丢失准确的位置信息。
2.1.4 V-Net
V-Net 也就是 3D 的 U-net 的一种版本,3D 卷积,引入残差模块和 U-Net 的框架。整个网络分为压缩路径和非压缩路径,也就是缩小和扩大 feature maps,每个 stage 将特征缩小一半,也就是 128-128-64-32-16-8,通道上为 1-16-32-64-128-256。每个 stage 加入残差学习以加速收敛。 图中的圆圈加交叉代表卷积核为 5 乘 5 乘 5,stride 为 1 的卷积,可知 padding 为 2 乘 2 乘 2 就可以保持特征大小不变。每个 stage 的末尾使用卷积核为 2 乘 2 乘 2,stride 为 2 的卷积,特征大小减小一半(把 2x2 max-pooling 替换成了 2x2 conv.)。整个网络都是使用 keiming 等人提出的 PReLU 非线性单元。网络末尾加一个 1 乘 1 乘 1 的卷积,处理成与输入一样大小的数据,然后接一个 softmax。
而且 V-Net 采用 Dice coefficient 损失函数,如下:
Pi 为预测的前景,Gi 为标记的前景,使用这个函数能有效避免类别不平衡的问题。
2.1.5 Dense-UNet
Dense U-net(原名:one-hundred layers Tiramisu Network)该架构是由密集连接块(dense block)构建的。该架构由向下过度的两个下采样路径和向上过度的两个上采样路径组成。且同样包含两个水平跳跃连接,下采样 Dense 模块的输出与同水平的上采样 Dense 模块输入的相应特征图拼接在一起。上采样路径和下采样路径的连接模式并不完全相同:下采样路径中,每个密集块外有一条跳跃性连接,从而导致 feature map 数量线性增长,上采样中没有此操作。
主要创新点是融合了 Dense-Net 和 U-Net 网络。
2.1.6 DeepLab 系列网络
DeepLabV1:首次把空洞卷积(dilated convolution) 引入图形分割领域, 融合卷积神经网络和概率图模型:CNN + CRF,提高了分割定位精度。
DeepLabV2:ASPP (扩张空间金字塔池化):CNN+CRF。
DeepLabV3:改进 ASPP,多了 1 乘 1 卷积和全局平均池化(global avg pool);对比了级联和并联空洞卷积的效果。
DeepLabV3+:加入编解码架构思想,添加一个解码器模块来扩展 DeepLabv3;将深度可分离卷积应用于 ASPP 和解码器模块;将改进的 Xception 作为 Backbone。
2.1.7 PSPNet
PSPNet 全名是 Pyramid Scene Parsing Network(金字塔场景解析网络)。提出了金字塔池化模块(pyramid pooling module)能够聚合不同区域的上下文信息,从而提高获取全局信息的能力。
输入图像后,使用预训练的带空洞卷积 ResNet 提取特征图。最终的特征映射大小是输入图像的 1/8;在特征图上,我们使用 C 中的金字塔池化模块收集上下文信息。使用 4 层金字塔结构,池化内核覆盖了图像的全部、一半和小部分。他们被融合为全局先验信息;在 c 的最后部分将之前的金字塔特征映射与原始特征映射 concate 起来;在进行卷积,生成 d 中的最终预测图。
总结
基于深度学习的图像语义分割模型大多遵循编码器-解码器体系结构,如 U-Net。近几年的研究成果表明,膨胀卷积和特征金字塔池可以改善 U-Net 风格的网络性能。
参考文献:
Deep Semantic Segmentation of Natural and Medical Images: A Review
肝脏肿瘤分割方法
unet-lits-2d-pipeline肝脏肿瘤分2次训练
通过使用级联,紧密连接的2D U-Net和基于Tversky系数的损失函数,我们的框架实现了非常好的形状提取,具有很高的检测灵敏度,并且在发布时具有竞争性得分。此外,在我们的Tversky-loss 允许调整超参数来调整网络。以获得更高的灵敏度或鲁棒性。
我们评估使用深度卷积神经网络架构Tiramisu和U-Net,并进行标准的数据预处理和数据增强,而无需进行任何复杂的后处理,可以取得什么结果。
完整的流水线类似于[7]中巧兆提出的级联方法,其中作者建议使用U-Net级联(以及基于条件随机字段的其他后续后处理步骤)。在我们的肝脏分割案例中,训练了一个标准的U-Net以减少总体训练时间,而在病变分割中,对上述提拉米苏进行了从零开始的训练(无转移学习),并使用了Tversky损失函数,以改进基于简单Dice的损失函数
从130个训练扫描中,我们选择了25个扫描用于训练期间的验证目的,而选择105个用于实际训练。
HU值[-100,400],以去除空气和骨骼状结构以获得更均匀的背景。然后通过减去训练集均值来标准化体素值,并通过除以训练集标准差来进行标准化。在最后一步中,从NIfTI标头中提取了仿射矩阵,以将每个体积旋转到相同位置,从而使学习更加轻松
如前所述,病变分割管线包括两个不同的网络:U-Net从给定的体积切片中分割肝脏,而乱瞎提拉米苏托则分割出病变。通过用肝脏mask掩盖病变区域,我们有效地减少了肝外区域的假阳性数。
我们的U-Net在 maxpool 之前通过两个卷积孝陪租层(same padding)和一个ReLU激活层来实现,以使U分支向下移动。这些块总共重复了四次。我们从32channel 和恒定的3×3卷积核尺寸开始。在每个卷积最大合并块之后,过滤器的数量增加一倍。在ReLU激活层之后以0.2的速率进行滤除。以相同的方式实现执行转置卷积以重构分割图像的上采样分支。总共大约有 个网络参数。
提拉米苏的实现方法与原始论文中所述的一样,在特征提取分支中有4个denseblocks 分别包含4,5,6和7层,以及具有8个 densely connected层的 1个 final bottleneck denseblock。每个密集块的growth rate为12,后接maxpool,初始channel为32。在每个密集块后面接一个执行概率为0.2的Dropout,然后上采样。使用ReLU激活函数,并在卷积层中添加 的L2正则化。卷积大小为3×3,前接BN。参数数量为 ,约是标准U-Net的1/4。
使用Adam在GTX 1070 GPU上以50个周期进行了训练,批次大小为5,初始化使用何凯明法,bce loss和10-5的学习率,每15个周期学习率减少一半。没有使用数据增强。
使用Adam优化方法和基于Tversky系数(throughsimple negation)的tversky loss,训练35个时期。
对于loss,设置 。我们对β假阳性预测的惩罚更高,因为在不进行转移学习的情况下训练提拉米苏,简单的wbc loss或dice loss显示网络很容易出现β假阳性率。选择初始学习速率 ,每10个周期减半。batch size为5,进行了数据增强(微小旋转和平移以及缩放)。肝脏大小为224
每次肝分割后,仅选择最大的连通区域作为最终肝掩膜。
有一些方法可以提高分割功能:
(1)我们错过了肝脏边界处的大部分非常大和/或病变的部位(见图1),尽管这可能是通过病变分割网络检测到的,但被掩盖了。因此,增加对肝脏分割网络的训练力度将使我们能够更好地改善当前的病变(和肝脏)分割结果。我们试图通过各向同性地扩张肝脏面罩来对抗这种效果(图1),但这只会使最终结果恶化,因为引入的假阳性要高于删除假阳性的数量
(2)即使我们当前使用Tversky loss,主要的误差源仍是假阳性预测。更高的惩罚,更高的网络集成度和更正则化(例如,更高的Dropout率或更复杂的数据增强)将理想地增加ROC曲线下的面积并提供更好的总体评分。
此外,在提拉米苏的基础上训练肝脏分割网络,并将其用作权重初始化可能会帮助网络更快地收敛并获得更好的结果。
最后,[7]和[14]表明良好的后处理(例如3D条件随机场和具有附加手工功能的随机森林)可以改善结果。我们认为这是值得探讨这些数据的途径。同样,仅在逐个2Dslice的基础上执行分段。 [15]通过使用半3D方法显示出优异的结果,方法是在神经网络的分割过程中包括附加的上层和/或下层切片,以合并更多的空间信息。
通过挖掘mask的信息更好的实现分割
对于基于U-Net的模型,提出了一种新的程序来改善肝脏和病变的分割。我们的方法扩展了标准分割流程,通过将分割erro附加到主训练设置中,以得到更高的召回率或减少嘈杂的假阳性预测。这使模型能够找到可以解释先前错误的特征。dice提高了2个点。
我们提出了一种新颖的流水线,通过在后续训练步骤中将分割erro作为新的训练遮罩来可靠地提高网络分割性能。
基本设置: 通过单个前向通道以最小的计算负担即可生成训练数据的分割mask。然后,根据分割错误情况,将这些遮罩与原始地面真实图像进行比较,以确定每个像素/体素的新训练类别:True Negative,False Positive,False Negative,True Positive.与具有两个类的二进制情况相比,这提供了四个目标类。然后,我们将四个单层输出通道作为错误预测层附加到输出层。这不会引入相关的新参数,但会确保在微调之前保留所有先前学习的权重。最后,对新的掩模进行再训练。由于初始预训练,收敛速度更快。
损失函数的相关性: 损失的选择将再培训分为两个等价部分设置。通常经过训练后,大部分预测像素为true positive or negative
A pixel-weighted cross-entropy loss (pwce)[U-Net] 向高频目标提供最高的学习信号。由于我们对真阳性/真阴性预测的不平衡度很高,对错误掩码的再培训主要是加强这些预测,同时减少噪声误报。然后将重新训练的、现在是多类的错误情况预测分组为真阳性/假阴性预测和真阴性/假阳性预测,以生成最终的新二进制分割掩码
A dice-coefficient based loss 为代表性不足的类注入了更强的学习信号,以实现更高的假阴/阳性像素的恢复。在这里,主要的兴趣在于解释模糊的特征,同时保留关键的特征,所以真阳性错误掩码类被替换成了地面真相分割掩码。这使得网络可以将产生假阳性的属性转移到相应的输出通道,并恢复假阴性预测的生成器.最终的分割直接取自真阳性输出通道。
这两种损失都可以提高性能。但是,对于所有后续结果,都使用基于dice的损失,因为它可以提供稍高的改进。
Network Architecture: 我们通过评估不同架构上的dice得分来研究我们的方法在肝脏和病变分割中的性能:(i)级联2D [2],它分别训练用于肝和病变分割的2D分割网络,(ii)级联3D,与2D的设置相同;(iii)组合级联2D [13],它可以在同时设置的情况下,针对肝和病变分别训练分割网络。所有网络都使用通用扩展,例如多切片输入[5],批处理归一化[7]或残差块[6]。在应用扩展之前,对每个管道进行了收敛训练,以确保我们不会延长训练过程。最初的训练是使用pwce损失和肝脏的距离变换权重图(请参阅[10]),以及基于pwce损失Lpwce除以平滑骰子得分Ldice来进行的损失(例如参见[4])。
LiTS dataset: 在训练之前,在执行归一化之前,数据将绑定到[-100,600] HU。进行评估时,仅使用最大的连接组件来生成最终的肝脏分割。
Results: 在训练过程中加入经过挖掘训练的掩码,特别有利于验证性能。这根源于拆分程序,因为训练集和验证集都是从同一个样本集中抽取的。由于不同的来源对数据集的贡献[1],测试集样本因此与训练集的差异更大。因此,新挖掘的特征在验证集上的表现力更强。
unet-lits-2d-pipeline增加可删减的模块
我们提出了一种新的程序,以改善基于U-Net的模型的CT扫描中的肝脏和病变段。我们的方法扩展了标准的细分渠道,将重点放在更高的目标召回率或降低嘈杂的假阳性预测上,从而提高了整体细分效果。为了实现这一目标,我们将分段错误包含在新的学习过程中,该过程附加到主培训设置中,从而使模型能够找到可以解释先前错误的特征。我们在语义上不同的体系结构上进行评估:级联的二维和三维以及用于多任务分割的组合学习设置。肝脏和病变分割数据由肝脏肿瘤分割挑战(LiTS)提供,dice得分最多增加2个点。
我们提出了一种新颖的流水线,可通过在训练后步骤中加入分段错误作为新的训练遮罩,从而可靠地提高网络分段性能。尤其适用于三维数据,这在许多医学分割任务中很常见。
因此,我们建议在一个独立于主训练的设置中使用分割错误类型。 利用所学网络的分割错误,我们附加了一个具有特定损失函数的二次训练过程,以提供一个框架,帮助网络解释掉自己的分割错误,从而提升分割性能(定性印象见图1)。之前的工作s.a.[8]已经证明了解释掉不希望的属性的好处。 这意味着我们的方法不受架构和数据选择的影响,可以在不需要重新运行完整设置的情况下提高性能。
参考链接:
True Positive, True Negative, False Positive, False Negative概念区分
[img]unet模型属于哪种神经网络
unet模型属于卷积神经网此烂络。是德国弗莱堡大学计算机科学系为生物医学图像分割而开发的,该网络基于全卷积网络其架构经过修改和扩展,可以使用更少的训练图像数枝并产生更精确的分割,Unet是2015年诞生的模型。
unet模型的特点
Unet是比较早的基于深度学习的分割算法了,优点是速度真的快P100上基于VGG的backbone能跑到50帧,同时不是太开放的场景下可以做到令人满意的分割效果,在对实时性要求较高的场合下是比较适用的不是所有的场合都能上MaskRCNN的Backbone大一点。
如果显卡差点就容易爆显存了,同时相比大分割网络的模型森毕漏动辄几百Mb,Unet用小backbone模型就可以做到10Mb内,Conv层通道减少一点再把网络模型参数分开,模型大小可以做到很小,用CPU跑速度都挺快的,关键是分割精度在较为简单场景下还可以。
第五天 综述笔记2 10大类基于深度学习的segmentation model
第一类: FCN(完全卷积网络)
简介;FCN是一种端到端的深度学习图像分割算法,让网络做像素的预测,直接得到label map
传统cnn缺点:存储开销大,效率低下,像素块的大小限制了感受区域的大小
FCN改变了什么:经典的cnn在卷积层之后时使用了全连接层得到固定长度的整个输入图像的概率向量,适合用于图像的分类和回归任务,经过 softmax后可以获得类别概率信息,但是这个概率信息是1维的,只能表示出整个图像的类别,所以这种全连接方法不适用于图像分割。FCN将Cnn的全连接层换成卷积层(1000个节点的全连接层换成1000个1*1的卷积核的卷积层),这样可以得到2维的fp,再通过softmax可以得到每个像素点的类别信息,从而解决分割问题。
FCN结构:FCN可以接受任何尺寸的输入图像,在最后得到的fp后,通过亮桐让反卷积层进行上采样,使他恢复到输入图像的尺寸,从而可以对每一个像素都产生预测,保留原始图像当中的空间信息。
为啥cnn不能随便尺寸输入:因为cnn的全连接层会得到一个拉直的向量,向量中比方说有n*n个元素,这n*n个元素每个元素当作一个结点与下一层全连接,如果下一层比方说节点数是4096,权值数就是4096*n*n。神经网络结构确定,那么权值数就要确定了,上一层的输出就不能变了,然后倒着往前推,每轮巧一层输出都不能变,因此输入就必须得固定。
skip state:由于最后这个特征图太小,容易丢失很多细节,增加一个skip state这样的一个结构,最后一层的预测(局部信息)和更浅层(全局信息)预测结合起来,这样就是既局部还全局。
FCN缺点:实施推理速度不够快,对各个像素进行分类,没有考虑像素与像素之间的一个关系,不容易移植到三维图像当中。
第二类:基于CNN和完全连接的CRF的语义分割算法
FCN可能忽略了有用的场景级语义上下文,为了集成更多上下文信息
cnn+crfcnn+softmax
fcn得到粗分值图,经过双线性插值上采样恢复分辨率,然后再将它传递给全连接的crf层细化分割结果。最终实验表明:有更高的准确率来定位边界。
第三类:编码器加解码器结构(unet,vnet)
分为一般的分割跟医学图像的分割。
一个是使用从VGG 16层网络采用的卷积层的编码器,另一个是将特征向量作为输入并生成像素级类概率图的反卷积网络。
segnet
SegNet的主要新颖之处在于解码器对其较低分辨率的输入特征图进行升采样。具体来说,它使用在相应编码器的最大池化步骤中计敬局算出的合并索引来执行非线性上采样,从而消除了学习上采样的需求.与其他竞争性体系结构相比,SegNet的可训练参数数量也明显更少并且能够提升边缘刻画度。 (ex:SDN,Linknet,w-net)
segnet的encoder过程中卷积起到提取特征的作用,使用的是same卷积,卷积后不改变图片的大小。同时在decoder过程中,同样是采用了same卷积,作用是upsample之后丰富变大图片的信息
u-net
(医学影像分割的论文几乎都是用u-net来改良的)
在医学图像分割上,在编码器部分,类似于FCN,下采样采用conv3*3,全卷积神经网络。
上采样 conv2*2 ,插值法(不使用转置卷积,为了让特征图保持着均匀的色差)
最后有个1*1(将特征通道数降至特定的数量 )
为了降低在压缩路径当中造成的图像细节损失,作者会将压缩路径当中的fp叠加到拓张路径的相同尺寸的fp上,再进行conv,upsample.以此整合更多更完整的图像信息。
v-net
基于FCN用于3D医学图像分析的图像分割网络。最后输出的是三维的单通道数据,代表每一个像素是前景还是背景的概率,如果概率大于0.5是前景,概率小于0.5是背景。
第四类:多尺度分析跟金字塔网络
尺度:分辨率 多尺度:所训练出来的成功的模型,他在换到另一个尺度下很有可能失效
提出了一个pspnet,实现利用上下文信息的能力来进行场景解析,又到了老生常谈的问题,FCN不能很好的利用全局信息(比如说,FCN非认为右边是车,但是左边就有船坞,他不能利用这种线索来进行一个判断)
DM-Net (Dynamic Multi-scale Filters
Network) Context contrasted network and gated multi-
scale aggregation (CCN) Adaptive Pyramid Context
Network (APC-Net) Multi-scale context intertwining
(MSCI)
第五类:实例分割当中基于r-cnn的模型
r-cnn.fast r-cnn.faster r-cnn mask r-cnn
Mask RCNN使用ResNet+FPN(特征金字塔网络)进行特征提取。顶层特征(最后一层特征图),感受野最大,特征信息最丰富,但对小物体的检测效果并不好。因此,将多个阶段的特征图融合在一起(FPN),这样既有了高层的语义特征,也有了底层的轮廓特征。
RoI Align替代RoI Pooling RoI Pooling有什么问题?经过两次量化,使特征图对应位置不准。
增加Mask分支(语义分割)Mask分支只做语义分割,类型预测的任务交给另一个分支。
AI面试题第二弹(神经网络基础)
提取主要特征,减小网络参数量,减小计算量
层层传递的梯度1 梯度爆炸
层层传递的梯度1 梯度消失
与权重有很大关系,激活函数的影响较小。
每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。
这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
比较常肢枯见的是l1l1l1正则,和l2l2l2正则,在各个深度框架中都有相应的API可以使用正则化
反向传播中,经过每一层的梯度会乘以该层的权重。
举个简单例子:
为了得到一致假设而使假设变得过度复杂称为过拟合(overfitting), 过拟合表现在训练好的模型在训练集上效果很好,但是在测试集上效果差 。也就是说模型的泛化能力弱。
过拟合主要由两个原因造成,数据集太小神闷或模型太复杂
(1). 数据集扩增(Data Augmentation)
(2). 改进模型
·Early Stopping。在模型效果比较好的时候便提前停止训练
·正则化(regularization)
L1:稀疏参数
L2:更小参数
·Dropout
·多任务学习
深度学习中两种多任务学习模式:隐层参数的硬共享和软共享
硬共享机制是指在所有任务中共享隐藏层,同时保留几个特定任务的输出层来实现。硬共享机制降低了过拟合的风险。多个任务同时学习,模型就越能捕捉到多个任务的同一表示,从而导致模型在原始任务上的过拟合风险越小。
软共享机制是指每个任务有自己的模型,自己的参数。模型参数之间的距离是正则化的,以便保障参数相似性。
见后文
leaky relu
输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图中虚线为部分临时被删除的神经元)
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有游饥弯所更新)
从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
没有对数据进行归一化
忘记检查输入和输出
没有对数据进行预处理
没有对数据正则化
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误
网络设计不合理(任务-网络不匹配)
机器学习有个很重要的假设:就是假设训练数据和测试数据是满足独立同分布的,这保障了通过训练数据获得的优秀模型也能够在测试集获得好的效果。但是在机器学习训练中输入层的每个批量(X,Y)中X的分布是不一致的,并且神经网络的隐藏层的输入分布在每次训练迭代中发生变化。 BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前(激活前)的 输入值 (就是那个x=WU+B,U是输入) 随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近 (对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这 导致反向传播时低层神经网络的梯度消失 ,这是训练深层神经网络收敛越来越慢的 本质原因 , 而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布 ,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是 这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
但是接下来的问题是:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了,意味着网络的非线性表达能力下降了, 所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift), 每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于激活前的值经过标准正太分布归一化后再从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢
Batch Normalization 好处:(1)提高了训练速度,收敛速度也大大加快(2)另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等 (3)可以防止梯度消失(4)BN类似于Dropout的一种防止过拟合的正则化表达方式,可以有效防止过拟合,不用太依赖dropou和正则化
以下情况最好不要使用BN:(1)数据不平衡(2)batch_size太小
batch_size是机器学习中的一个重要参数,决定了梯度下降的方向,如果数据集比较小,完全可以采用全数据集的形式计算梯度,由全数据集确定的梯度方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。对于大型数据集则需要使用mini-batch_size,因为随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
当batch_size=1,即在线学习,模型难以达到收敛 。
合理增加batch_size好处 :
(1)内存利用率提高了,大矩阵乘法的并行化效率提高
(2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
(3)在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小
盲目增大 Batch_Size 坏处 :
(1)内存利用率提高了,但是内存容量可能撑不住了
(2)跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同精度所需要的 epoch 数量越来越多,花费的时间越长
(3)大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,后者具有更好的泛化能力。
总之batchsize在变得很大(超过一个临界点)时,会降低模型的泛化能力。在这个临界点之下,模型的性能变换随batch size通常没有学习率敏感
目标所在的真实框(ground truth) 与算法预测的目标所在的框(bounding box)的交集与并集的比值,我们会用IOU阈值来判定预测的bounding box是否有效。一般阈值会设定在0.5,当IOU的值大于等于0.5时,我们会把这个预测的bounding box 归为正类,而小于0.5的归为负类。
牛顿法使用的是目标函数的二阶导数,在高维情况下这个Hessian(n*n维度)矩阵非常大,计算复杂度是n*n,计算和存储都是问题
(1) 通过控制卷积核个数实现升维或者降维,从而减少模型参数和计算量
(2) 用于不同channel上特征的融合
(3)1x1的卷积相当于全连接层的计算过程,并且加入了非线性激活函数,从而增加了网络的非线性,使得网络可以表达更加复杂的特征。
它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1
缺点:
(1)函数的饱和区,导致梯度几乎为0,造成梯度消失问题
(2)Sigmoid 的 output 不是0均值,具体解释见
(3)其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
它解决了Sigmoid函数的不是零均值输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
(1)在正区间解决了梯度消失的问题
(2)函数简单,计算速度快,收敛速度远快于sigmoid和tanh
缺点:
(1)Relu函数输出不是0均值
(2)神经元坏死问题:指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,有两个主要原因导致这种状况发生
(1) 非常不幸的参数初始化,这种情况比较少见
(2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法
为了解决ReLU函数带来的神经元坏死问题 , 提出了将ReLU的前半段设为αx,α通常设为0.01,,另外一种直观的想法是基于参数的方法PReLU函数, α可由方向传播算法学习出来。
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:(1)不会有神经元坏死现象(2)函数输出均值接近于0
但是ELU的小问题就是计算量稍微有点大。
1、使用不同的激活函数,比如Relu,Leak-Relu,PRelu,elu等激活函数代替sigmoid函数
2、使用Batch Normalizaion(批量归一化)
3、使用残差网络
4、预训练加微调
1、梯度裁剪
2、权重正则化
两个3x3的卷积核的感受野比5x5的卷积核的感受野大,在保持相同感受野的同时,用3x3的卷积核可以提升网络的深度,可以很明显的减少计算量。
1、局部连接
2、权值共享:减小参数量
3、池化操作:增大感受野
4、多层次结构:可以提取low-level以及high-level的信息
1、数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。
2、数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。
作用 :对输入的特征图进行压缩,
一方面使特征图变小,简化网络计算复杂度;
一方面进行特征压缩,提取主要特征。
通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是 max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性 。 pooling的主要作用一方面是去掉冗余信息,一方面要保留feature map的特征信息,在分类问题中,我们需要知道的是这张图像有什么object,而不大关心这个object位置在哪,在这种情况下显然max pooling比average pooling更合适。在 网络比较深的地方,特征已经稀疏了,从一块区域里选出最大的,比起这片区域的平均值来,更能把稀疏的特征传递下去 。
average-pooling更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在 信息的完整传递这个维度 上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
average-pooling在 全局平均池化操作 中应用也比较广,在ResNet和Inception结构中最后一层都使用了平均池化。有的时候在模型接近 分类器的末端使用全局平均池化还可以代替Flatten操作 ,使输入数据变成一位向量。
CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化(步长也为2),假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把 某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变 ,图示如下 :
(2) max pooling
max pooling也要满足梯度之和不变的原则 ,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么 反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。 所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :
28、细粒度分类
29、LSTMRNN
30、解释LSTM结构(相对于RNN)的好处
31、RNN的梯度消失原因和解决办法
32、Object Detection
33、Unet的介绍
34、FCN和Unet的区别
35、RCNN系列的算法流程和区别
36、Fast RCNN中 bbox 回归的损失函数什么
37、解释 ROI Pooling 和 ROI Align
38、Mask RCNN中 mask branch 如何接入 Faster RCNN中
39、解释 FPN
40、解释 ROI Align
41、简述 YOLO 和 SSD
42、简述 Hough 直线检测、Sobel 边缘检测算法流程
43、Mask RCNN中的anchors如何判定为正负样本
44、简述 NMS 算法流程
45、attention起源是用在哪里?pixel还是frame,是soft还是hard
46、anchor的正负样本比是多少
47、算法和激活函数等
48、BN的原理和作用
49、BN层反向传播,怎么求导
50、BN 的作用和缺陷,以及针对batch_size小的情况的改进(GN)
51、BN层,先加BN还是激活,有什么区别
52、手推BP
53、优化算法举例和他们的区别(SGD、SGDM、RMSprop、Adam)
54、随机梯度下降和梯度下降
55、训练不收敛的原因有哪些
56、简述 SVM 流程、核函数寻参及常见的核函数举例
57、batch_size 和 learning rate 的关系(怎么平衡和调整二者)
58、解释过拟合和欠拟合,以及解决方法
59、激活函数有哪些,各自区别
60、损失函数有哪些
61、Sigmoid 和 ReLu 对比(各自优缺点)
62、为什么不用sigmoid而用relu?做出了哪些改进?
63、梯度消失和梯度爆炸的原因和解决方法
64、Precision 和 Recall 的定义
65、精确率高、召回率低是为什么
66、SVM,线性回归和逻辑回归的原理及区别
67、PCA原理,PCA和SVD的区别和联系
68、正则化怎么选择,有哪些方式
69、L1、L2范数,区别
70、boost、Adaboost
71、dropout和batch normalization
72、讲一下决策树和随机森林
73、讲一下GBDT的细节,写出GBDT的目标函数。 GBDT和Adaboost的区别与联系
74、偏差、方差
75、距离度量公式哪些,区别
76、多标签识别怎么做
77、data argumentation怎么处理的
78、数据不均衡怎么处理、只有少量带标签怎么处理
79、权重初始化方法都有哪些
80、权值衰减这个参数怎么设置
81、分类问题有哪些评价指标?每种的适用场景。
82、无监督学习了解哪些
83、图像处理Opencv
84、边缘检测算子有哪些
85、霍夫变换
86、直方图是什么
87、canny算子是怎么做的
88、图像的特征提取有哪些算法,适用范围、优缺点
参考:
U-Net实现语音分离的代码分析
不是自己对着论文复现的,是网上找来自己改的
数据集处理,将DSD100数据集的音频文件转换为时频声谱。
DSD 包含两个文件夹,一个是混合音频的文件夹"Mixtures", 另一个是人声、鼓、贝司、其他乐器的分轨音频"Sources"。每个文件夹里包含两个子文件夹,"Dev" 是训练集,"Test"是测试集。
主要用到 util.SaveSpectrogram(y_mix, y_vocal, y_inst, fname)
输入音频路径,训练模型或用现有模型,从原始音频获得分离的人声/分离的音频
调用了五个主要接口:
util.LoadDataset(target) 加载数据集,target就是要分离的目标,这里为“voice”
network.TrainUNet(Xlist,Ylist,savefile="unet.model",epoch=30) 训练网络
util.LoadAudio(fname) 加载音频
util.ComputeMask(input_mag, unet_model="unet.model", hard=True) 计算掩码
util.SaveAudio(fname, mag, phase) 保存音频
(如果有现成的模型,则只需要调用后三个函数)
函数返回的 Xlist 是混合音频的声谱, Ylist 是分轨的target音频的声谱链纤返。
find_files 是 librosa.util.find_files
load 是 librosa.core.load , 加载各种格式的音频
stft 是 librosa.core.stft ,短时傅里叶变化
(没想通为什么 number of frequency bins = 1 + n_fft/2 )
( 网上的解释 :The continuous Fourier transform possesses symmetries when computed on real signals (Hermitian symmetry). The discrete version, an FFT (of even length) possesses a slighty twisted symmetry.就是说FFT计算出来的结果是频率上对称的,存在"duplicated" in positive and negative frequencies.)
(phase也看不懂)
mag 是magnitude,做了绝对值
phase = np.exp(1.j*np.angle(spec)) 返回spec的复数角度
istft 是 librosa.core.istft
write_wav 是 librosa.output.write_wav
stft 是 librosa.core.stft ,短时傅里叶变化。SaveSpectrogram这个函数是处理数据集时用的,将数据集里的音频转化竖尘为声谱。
network.UNet() 调用U-Net神经网络,用训练好的棚饥模型来计算 hard mask 或 soft mask。
UNet class
TrainUNet:
U-Net其实就是输入空间与输出空间相同的一个映射。在训练时,输入是(MixSpec, TargetSpec) = (混合声谱,目标声谱),用Adam方法优化参数θ来得到一个mask = UNet_θ(MixSpec),MixSpec*mask使得尽可能逼近TargetSpec。
关于unet神经网络和unet神经网络的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。