前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台「建议收藏」

憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台「建议收藏」

作者头像
全栈程序员站长
发布于 2022-07-02 05:43:12
发布于 2022-07-02 05:43:12
2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台

注意事项

这是重新构建了的Unet语义分割网络,主要是文件框架上的构建,还有代码的实现,和之前的语义分割网络相比,更加完整也更清晰一些。建议还是学习这个版本的Unet。

学习前言

还是快乐的pytorch人。

什么是Unet模型

Unet是一个优秀的语义分割模型,其主要执行过程与其它语义分割模型类似。

Unet可以分为三个部分,如下图所示:

第一部分是主干特征提取部分,我们可以利用主干部分获得一个又一个的特征层,Unet的主干特征提取部分与VGG相似,为卷积和最大池化的堆叠。利用主干特征提取部分我们可以获得五个初步有效特征层,在第二步中,我们会利用这五个有效特征层可以进行特征融合。

第二部分是加强特征提取部分,我们可以利用主干部分获取到的五个初步有效特征层进行上采样,并且进行特征融合,获得一个最终的,融合了所有特征的有效特征层

第三部分是预测部分,我们会利用最终获得的最后一个有效特征层对每一个特征点进行分类,相当于对每一个像素点进行分类。

代码下载

Github源码下载地址为: https://github.com/bubbliiiing/unet-pytorch

Unet实现思路

一、预测部分

1、主干网络介绍

Unet的主干特征提取部分由卷积+最大池化组成,整体结构与VGG类似。

本文所采用的主干特征提取网络为VGG16,这样也方便使用imagnet上的预训练权重。

VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。

该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。 它的结构如下图所示:

这是一个VGG16被用到烂的图,但确实很好的反应了VGG16的结构。

当我们使用VGG16作为主干特征提取网络的时候,我们只会用到两种类型的层,分别是卷积层最大池化层

当输入的图像大小为512x512x3的时候,具体执行方式如下: 1、conv1:进行两次[3,3]的64通道的卷积,获得一个[512,512,64]的初步有效特征层,再进行2X2最大池化,获得一个[256,256,64]的特征层。 2、conv2:进行两次[3,3]的128通道的卷积,获得一个[256,256,128]的初步有效特征层,再进行2X2最大池化,获得一个[128,128,128]的特征层。 3、conv3:进行三次[3,3]的256通道的卷积,获得一个[128,128,256]的初步有效特征层,再进行2X2最大池化,获得一个[64,64,256]的特征层。 4、conv4:进行三次[3,3]的512通道的卷积,获得一个[64,64,512]的初步有效特征层,再进行2X2最大池化,获得一个[32,32,512]的特征层。 5、conv5:进行三次[3,3]的512通道的卷积,获得一个[32,32,512]的初步有效特征层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.nn as nn
from torchvision.models.utils import load_state_dict_from_url

class VGG(nn.Module):
    def __init__(self, features, num_classes=1000):
        super(VGG, self).__init__()
        self.features = features
        self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, num_classes),
        )
        self._initialize_weights()

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                nn.init.constant_(m.weight, 1)
                nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)


def make_layers(cfg, batch_norm=False, in_channels = 3):
    layers = []
    for v in cfg:
        if v == 'M':
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            if batch_norm:
                layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]
            else:
                layers += [conv2d, nn.ReLU(inplace=True)]
            in_channels = v
    return nn.Sequential(*layers)

cfgs = { 
   
    'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']
}


def VGG16(pretrained, in_channels, **kwargs):
    model = VGG(make_layers(cfgs["D"], batch_norm = False, in_channels = in_channels), **kwargs)
    if pretrained:
        state_dict = load_state_dict_from_url("https://download.pytorch.org/models/vgg16-397923af.pth", model_dir="./model_data")
        model.load_state_dict(state_dict)
    
    del model.avgpool
    del model.classifier
    return model

2、加强特征提取结构

Unet所使用的加强特征提取网络是一个U的形状。

利用第一步我们可以获得五个初步的有效特征层,在加强特征提取网络这里,我们会利用这五个初步的有效特征层进行特征融合特征融合的方式就是对特征层进行上采样并且进行堆叠

为了方便网络的构建与更好的通用性,我们的Unet和上图的Unet结构有些许不同,在上采样时直接进行两倍上采样再进行特征融合,最终获得的特征层和输入图片的高宽相同。

具体示意图如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary
from nets.vgg import VGG16


class unetUp(nn.Module):
    def __init__(self, in_size, out_size):
        super(unetUp, self).__init__()
        self.conv1 = nn.Conv2d(in_size, out_size, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(out_size, out_size, kernel_size=3, padding=1)
        self.up = nn.UpsamplingBilinear2d(scale_factor=2)

    def forward(self, inputs1, inputs2):

        outputs = torch.cat([inputs1, self.up(inputs2)], 1)
        outputs = self.conv1(outputs)
        outputs = self.conv2(outputs)
        return outputs


class Unet(nn.Module):
    def __init__(self, num_classes=21, in_channels=3, pretrained=False):
        super(Unet, self).__init__()
        self.vgg = VGG16(pretrained=pretrained,in_channels=in_channels)
        in_filters = [192, 384, 768, 1024]
        out_filters = [64, 128, 256, 512]
        # upsampling
        self.up_concat4 = unetUp(in_filters[3], out_filters[3])
        self.up_concat3 = unetUp(in_filters[2], out_filters[2])
        self.up_concat2 = unetUp(in_filters[1], out_filters[1])
        self.up_concat1 = unetUp(in_filters[0], out_filters[0])

        # final conv (without any concat)
        self.final = nn.Conv2d(out_filters[0], num_classes, 1)

    def forward(self, inputs):
        feat1 = self.vgg.features[  :4 ](inputs)
        feat2 = self.vgg.features[4 :9 ](feat1)
        feat3 = self.vgg.features[9 :16](feat2)
        feat4 = self.vgg.features[16:23](feat3)
        feat5 = self.vgg.features[23:-1](feat4)

        up4 = self.up_concat4(feat4, feat5)
        up3 = self.up_concat3(feat3, up4)
        up2 = self.up_concat2(feat2, up3)
        up1 = self.up_concat1(feat1, up2)

        final = self.final(up1)
        
        return final

    def _initialize_weights(self, *stages):
        for modules in stages:
            for module in modules.modules():
                if isinstance(module, nn.Conv2d):
                    nn.init.kaiming_normal_(module.weight)
                    if module.bias is not None:
                        module.bias.data.zero_()
                elif isinstance(module, nn.BatchNorm2d):
                    module.weight.data.fill_(1)
                    module.bias.data.zero_()

3、利用特征获得预测结果

利用1、2步,我们可以获取输入进来的图片的特征,此时,我们需要利用特征获得预测结果。

利用特征获得预测结果的过程为: 利用一个1×1卷积进行通道调整,将最终特征层的通道数调整成num_classes。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchsummary import summary
from nets.vgg import VGG16


class unetUp(nn.Module):
    def __init__(self, in_size, out_size):
        super(unetUp, self).__init__()
        self.conv1 = nn.Conv2d(in_size, out_size, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(out_size, out_size, kernel_size=3, padding=1)
        self.up = nn.UpsamplingBilinear2d(scale_factor=2)

    def forward(self, inputs1, inputs2):

        outputs = torch.cat([inputs1, self.up(inputs2)], 1)
        outputs = self.conv1(outputs)
        outputs = self.conv2(outputs)
        return outputs


class Unet(nn.Module):
    def __init__(self, num_classes=21, in_channels=3, pretrained=False):
        super(Unet, self).__init__()
        self.vgg = VGG16(pretrained=pretrained,in_channels=in_channels)
        in_filters = [192, 384, 768, 1024]
        out_filters = [64, 128, 256, 512]
        # upsampling
        self.up_concat4 = unetUp(in_filters[3], out_filters[3])
        self.up_concat3 = unetUp(in_filters[2], out_filters[2])
        self.up_concat2 = unetUp(in_filters[1], out_filters[1])
        self.up_concat1 = unetUp(in_filters[0], out_filters[0])

        # final conv (without any concat)
        self.final = nn.Conv2d(out_filters[0], num_classes, 1)

    def forward(self, inputs):
        feat1 = self.vgg.features[  :4 ](inputs)
        feat2 = self.vgg.features[4 :9 ](feat1)
        feat3 = self.vgg.features[9 :16](feat2)
        feat4 = self.vgg.features[16:23](feat3)
        feat5 = self.vgg.features[23:-1](feat4)

        up4 = self.up_concat4(feat4, feat5)
        up3 = self.up_concat3(feat3, up4)
        up2 = self.up_concat2(feat2, up3)
        up1 = self.up_concat1(feat1, up2)

        final = self.final(up1)
        
        return final

    def _initialize_weights(self, *stages):
        for modules in stages:
            for module in modules.modules():
                if isinstance(module, nn.Conv2d):
                    nn.init.kaiming_normal_(module.weight)
                    if module.bias is not None:
                        module.bias.data.zero_()
                elif isinstance(module, nn.BatchNorm2d):
                    module.weight.data.fill_(1)
                    module.bias.data.zero_()

二、训练部分

1、训练文件详解

我们使用的训练文件采用VOC的格式。 语义分割模型训练的文件分为两部分。 第一部分是原图,像这样:

第二部分标签,像这样:

原图就是普通的RGB图像,标签就是灰度图或者8位彩色图。

原图的shape为[height, width, 3],标签的shape就是[height, width],对于标签而言,每个像素点的内容是一个数字,比如0、1、2、3、4、5……,代表这个像素点所属的类别。

语义分割的工作就是对原始的图片的每一个像素点进行分类,所以通过预测结果中每个像素点属于每个类别的概率与标签对比,可以对网络进行训练。

2、LOSS解析

本文所使用的LOSS由两部分组成: 1、Cross Entropy Loss。 2、Dice Loss。

Cross Entropy Loss就是普通的交叉熵损失,当语义分割平台利用Softmax对像素点进行分类的时候,进行使用。

Dice loss将语义分割的评价指标作为Loss,Dice系数是一种集合相似度度量函数,通常用于计算两个样本的相似度,取值范围在[0,1]。

计算公式如下:

就是预测结果和真实结果的交乘上2,除上预测结果加上真实结果。其值在0-1之间。越大表示预测结果和真实结果重合度越大。所以Dice系数是越大越好。

如果作为LOSS的话是越小越好,所以使得Dice loss = 1 – Dice,就可以将Loss作为语义分割的损失了。 实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch
import torch.nn.functional as F  
import numpy as np
from torch import nn
from torch.autograd import Variable
from random import shuffle
from matplotlib.colors import rgb_to_hsv, hsv_to_rgb
from PIL import Image
import cv2

def CE_Loss(inputs, target, num_classes=21):
    n, c, h, w = inputs.size()
    nt, ht, wt = target.size()
    if h != ht and w != wt:
        inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)

    temp_inputs = inputs.transpose(1, 2).transpose(2, 3).contiguous().view(-1, c)
    temp_target = target.view(-1)

    CE_loss  = nn.NLLLoss(ignore_index=num_classes)(F.log_softmax(temp_inputs, dim = -1), temp_target)
    return CE_loss

def Dice_loss(inputs, target, beta=1, smooth = 1e-5):
    n, c, h, w = inputs.size()
    nt, ht, wt, ct = target.size()
    
    if h != ht and w != wt:
        inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)
    temp_inputs = torch.softmax(inputs.transpose(1, 2).transpose(2, 3).contiguous().view(n, -1, c),-1)
    temp_target = target.view(n, -1, ct)

    #--------------------------------------------#
    # 计算dice loss
    #--------------------------------------------#
    tp = torch.sum(temp_target[...,:-1] * temp_inputs, axis=[0,1])
    fp = torch.sum(temp_inputs                       , axis=[0,1]) - tp
    fn = torch.sum(temp_target[...,:-1]              , axis=[0,1]) - tp

    score = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)
    dice_loss = 1 - torch.mean(score)
    return dice_loss

训练自己的Unet模型

首先前往Github下载对应的仓库,下载完后利用解压软件解压,之后用编程软件打开文件夹。 注意打开的根目录必须正确,否则相对目录不正确的情况下,代码将无法运行。 一定要注意打开后的根目录是文件存放的目录。

一、数据集的准备

本文使用VOC格式进行训练,训练前需要自己制作好数据集,如果没有自己的数据集,可以通过Github连接下载VOC12+07的数据集尝试下。 训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。 训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的SegmentationClass中。

二、数据集的处理

在完成数据集的摆放之后,我们需要对数据集进行下一步的处理,目的是获得训练用的train.txt以及val.txt,需要用到根目录下的voc_annotation.py。

如果下载的是我上传的voc数据集,那么就不需要运行根目录下的voc_annotation.py。 如果是自己制作的数据集,那么需要运行根目录下的voc_annotation.py,从而生成train.txt和val.txt。

三、开始网络训练

通过voc_annotation.py我们已经生成了train.txt以及val.txt,此时我们可以开始训练了。训练的参数较多,大家可以在下载库后仔细看注释,其中最重要的部分依然是train.py里的num_classes。

num_classes用于指向检测类别的个数+1!训练自己的数据集必须要修改!

之后就可以开始训练了。

四、训练结果预测

训练结果预测需要用到两个文件,分别是unet.py和predict.py。 我们首先需要去unet.py里面修改model_path以及num_classes,这两个参数必须要修改。

model_path指向训练好的权值文件,在logs文件夹里。 num_classes指向检测类别的个数+1。

完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147893.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
LSTM(长短期记忆网络)是一种循环神经网络(RNN)的变体,用于处理序列数据。它具有记忆单元和门控机制,可以有效地捕捉长期依赖关系。
Qomolangma
2024/07/30
1.5K0
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
神经网络结构——CNN、RNN、LSTM、Transformer !!
本文将从什么是CNN?什么是RNN?什么是LSTM?什么是Transformer?四个问题,简单介绍神经网络结构。
JOYCE_Leo16
2024/03/19
33.4K0
神经网络结构——CNN、RNN、LSTM、Transformer !!
⻓短期记忆LSTM
在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。LSTM就是具备了这一特性。
大数据技术与机器学习
2019/11/20
1.7K0
RNN及其变种LSTM/GRU/SRU
在某轮迭代tt中考虑公式5、6,用于计算RNN错误 ,我们对每一步迭代计算错误率总和。那么每一步tt的错误率 均可通过前面所列的计算出来。
百川AI
2021/12/31
9630
RNN及其变种LSTM/GRU/SRU
白话--长短期记忆(LSTM)的几个步骤,附代码!
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
mantch
2019/08/29
1.4K0
白话--长短期记忆(LSTM)的几个步骤,附代码!
变种 LSTM —— GRU 原理
门控循环单元(GRU)与 长短期记忆(LSTM)原理非常相似,同为使用门控机制控制输入、记忆等信息而在当前时间步做出预测。但比起 LSTM,GRU的门控逻辑有些许不同。
Ewdager
2020/07/14
1.5K0
变种 LSTM —— GRU 原理
一份详细的LSTM和GRU图解
在这篇文章中,我们将从LSTM和GRU背后的直觉开始。然后我(Michael)将解释使LSTM和GRU表现良好的内部机制。如果你想了解这两个网络背后的机制,那么这篇文章就是为你准备的。
AiTechYun
2018/10/25
3.8K0
一份详细的LSTM和GRU图解
教程 | 经典必读:门控循环单元(GRU)的基本概念与原理
选自Medium 作者:Simeon Kostadinov 机器之心编译 参与:蒋思源 LSTM 通过门控机制使循环神经网络不仅能记忆过去的信息,同时还能选择性地忘记一些不重要的信息而对长期语境等关系进行建模,而 GRU 基于这样的想法在保留长期序列信息下减少梯度消失问题。本文介绍了 GRU 门控机制的运算过程,更详细的内容请查看原论文。 在本文中,我们将讨论相当简单且可理解的神经网络模型:门控循环单元(GRU)。根据 Cho, et al. 在 2014 年的介绍,GRU 旨在解决标准 RNN 中出现的
机器之心
2018/05/11
10.8K0
深度学习基础入门篇-序列模型[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解
生活中,我们经常会遇到或者使用一些时序信号,比如自然语言语音,自然语言文本。以自然语言文本为例,完整的一句话中各个字符之间是有时序关系的,各个字符顺序的调换有可能变成语义完全不同的两句话,就像下面这个句子:
汀丶人工智能
2023/05/24
1.4K0
深度学习基础入门篇-序列模型[11]:循环神经网络 RNN、长短时记忆网络LSTM、门控循环单元GRU原理和应用详解
LSTM和GRU的解析从未如此通俗易懂
▌短时记忆 RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。 在反向传播期间,RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。
机器学习AI算法工程
2019/10/28
2.1K0
技能 | 三次简化一张图: 一招理解LSTM/GRU门控机制
作者 | 张皓 引言 RNN是深度学习中用于处理时序数据的关键技术, 目前已在自然语言处理, 语音识别, 视频识别等领域取得重要突破, 然而梯度消失现象制约着RNN的实际应用。LSTM和GRU是两种目前广为使用的RNN变体,它们通过门控机制很大程度上缓解了RNN的梯度消失问题,但是它们的内部结构看上去十分复杂,使得初学者很难理解其中的原理所在。本文介绍”三次简化一张图”的方法,对LSTM和GRU的内部结构进行分析。该方法非常通用,适用于所有门控机制的原理分析。 预备知识: RNN RNN (recurr
AI科技大本营
2018/04/26
1.3K0
技能 | 三次简化一张图: 一招理解LSTM/GRU门控机制
【AI前沿】深度学习基础:循环神经网络(RNN)
循环神经网络(RNN)与传统的前馈神经网络(如多层感知器和卷积神经网络)不同,RNN具有内存能力,能够在处理当前输入时保留之前的信息。这使得RNN特别适合处理序列数据,如文本、语音和时间序列等。
屿小夏
2024/07/13
4090
【AI前沿】深度学习基础:循环神经网络(RNN)
循环神经网络(二) ——GRU、LSTM、BRNN、deep RNN
循环神经网络(二) ——GRU、LSTM、BRNN、deep RNN (原创内容,转载请注明来源,谢谢) 一、概述 本文主要讲述RNN的其他结构,这些结构比RNN更常用,而且对于自然语言处理,有更高效
用户1327360
2018/03/29
3.8K0
循环神经网络(二) ——GRU、LSTM、BRNN、deep RNN
循环神经网络——实现LSTM
网络回忆:在《循环神经网络——介绍》中提到循环神经网络用相同的方式处理每个时刻的数据。
bear_fish
2018/09/19
1.1K0
循环神经网络——实现LSTM
十 | 门控循环神经网络LSTM与GRU(附python演练)
门控循环神经网络在简单循环神经网络的基础上对网络的结构做了调整,加入了门控机制,用来控制神经网络中信息的传递。门控机制可以用来控制记忆单元中的信息有多少需要保留,有多少需要丢弃,新的状态信息又有多少需要保存到记忆单元中等。这使得门控循环神经网络可以学习跨度相对较长的依赖关系,而不会出现梯度消失和梯度爆炸的问题。如果从数学的角度来理解,一般结构的循环神经网络中,网络的状态
磐创AI
2018/12/17
1.4K0
动图详解LSTM和GRU
反向传播(Back Propagation)是一种与最优化方法(比如梯度下降方法)结合、用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度,然后将梯度反馈给最优化方法,用来更新网络权重以最小化损失函数。
YoungTimes
2022/04/28
1.1K0
动图详解LSTM和GRU
【算法】循环神经网络RNN
小编邀请您,先思考: 1 RNN和LSTM有什么异同? 2 RNN的输入和输出分别是什么? 3 如何用Python实现RNN? 传统的机器学习方法,如SVM、logistics回归和前馈神经网络都没有将时间进行显式模型化,用这些方法来建模都是基于输入数据独立性假设的前提。但是,对于很多任务而言,这非常局限。举个例子,假如你想根据一句没说完的话,预测下一个单词,最好的办法就是联系上下文的信息。下面有两种解决方案 1.一种思路是记忆之前的分类器的状态,在这个基础上训练新的分类器,从而结合历史影响,但是这样需要大
陆勤_数据人网
2018/04/18
1.3K0
【算法】循环神经网络RNN
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
RNN在处理长期依赖(时间序列上距离较远的节点)时会遇到巨大的困难,因为计算距离较远的节点之间联系时会涉及雅可比矩阵的多次相乘,会造成梯度消失或者梯度膨胀的现象。为了解决该问题,研究人员提出了许多解决办法,例如ESN(Echo State Network),增加有漏单元(Leaky Units)等等,其中成功应用最广泛的就是门限RNN(Gated RNN),而LSTM就是门限RNN中最著名的一种。有漏单元通过设计连接间的权重系数,从而允许RNN累积距离较远节点间的长期联系;而门限RNN则泛化了这样的思想,允许在不同时刻改变该系数,且允许网络忘记当前已经积累的信息。
JOYCE_Leo16
2024/04/09
1700
深度学习500问——Chapter06: 循环神经网络(RNN)(3)
从90年代的SRNN开始,纵览循环神经网络27年的研究进展
选自arXiv 作者:Hojjat Salehinejad等 机器之心编译 参与:刘晓坤、路雪、蒋思源 近日,来自多伦多大学和滑铁卢大学的研究者撰文介绍循环神经网络的基础知识、近期发展和面临的挑战。机
机器之心
2018/05/11
7450
LSTM 为何如此有效?这五个秘密是你要知道的
长短期记忆网络(LSTM),作为一种改进之后的循环神经网络,不仅能够解决 RNN无法处理长距离的依赖的问题,还能够解决神经网络中常见的梯度爆炸或梯度消失等问题,在处理序列数据方面非常有效。
AI科技评论
2020/04/14
1.4K0
LSTM 为何如此有效?这五个秘密是你要知道的
推荐阅读
相关推荐
【深度学习实验】循环神经网络(三):门控制——自定义循环神经网络LSTM(长短期记忆网络)模型
更多 >
LV.1
马上科普教育科技有限公司
目录
  • 憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台
  • 注意事项
  • 学习前言
  • 什么是Unet模型
  • 代码下载
  • Unet实现思路
    • 一、预测部分
      • 1、主干网络介绍
      • 2、加强特征提取结构
      • 3、利用特征获得预测结果
    • 二、训练部分
      • 1、训练文件详解
      • 2、LOSS解析
  • 训练自己的Unet模型
    • 一、数据集的准备
    • 二、数据集的处理
    • 三、开始网络训练
    • 四、训练结果预测
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档