美文网首页
各种卷积简介

各种卷积简介

作者: dingtom | 来源:发表于2020-05-08 20:17 被阅读0次

3D 卷积

实际上是对一个 3D 体积执行卷积。但通常而言,我们仍在深度学习中称之为 2D 卷积。这是在 3D 体积数据上的 2D 卷积。过滤器深度与输入层深度一样。这个 3D 过滤器仅沿两个方向移动(图像的高和宽)。这种操作的输出是一张 2D 图像(仅有一个通道)。

3D 卷积确实存在。这是 2D 卷积的泛化。其过滤器深度小于输入层深度(核大小<通道大小)。因此,3D 过滤器可以在所有三个方向(图像的高度、宽度、通道)上移动。在每个位置,逐元素的乘法和加法都会提供一个数值。因为过滤器是滑过一个 3D 空间,所以输出数值也按 3D 空间排布。也就是说输出是一个 3D 数据。

3D 卷积可以描述 3D 空间中目标的空间关系。对某些应用(比如生物医学影像中的 3D 分割/重构)而言,这样的 3D 关系很重要,比如在 CT 和 MRI 中,血管之类的目标会在 3D 空间中蜿蜒曲折。

1×1 卷积



降维或升维
跨通道信息融合
减少参数量
增加模型深度,提高非线性


两个3*3代替一个5*5

参数量减少,非线性变换增多

假设输入的图片大小为100*100*3,卷积操作不改变大小(padding=same)。先看用128个7*7*3的核进行卷积操作,需要100*100*7*7*3*128次乘法操作然后我们用3层3*3卷积代替上面的7*7卷积,每层仍取128个核,需要100*100*3*3*3*128*3次乘法操作,约掉相同部分,分别剩下7*7=493*3*3=27.显然,用三层3*3代替一层7*7可以减少近一半的计算量。


1*1卷积跨通道交流信息、降维升维
VGG

卷积算术

转置卷积(去卷积、棋盘效应)

上采样生成高分辨率图像以及将低维特征图映射到高维空间,比如在自动编码器或形义分割中。(在后者的例子中,形义分割首先会提取编码器中的特征图,然后在解码器中恢复原来的图像大小,使其可以分类原始图像中的每个像素。)

转置卷积并非信号/图像处理领域定义的那种真正的去卷积。从技术上讲,信号处理中的去卷积是卷积运算的逆运算。但这里却不是这种运算。因此,某些作者强烈反对将转置卷积称为去卷积。人们称之为去卷积主要是因为这样说很简单。后面我们会介绍为什么将这种运算称为转置卷积更自然且更合适。

我们一直都可以使用直接的卷积实现转置卷积。对于下图的例子,我们在一个 2×2 的输入(周围加了 2×2 的单位步长的零填充)上应用一个 3×3 核的转置卷积。上采样输出的大小是 4×4。

多尺度卷积

扩张卷积

可分卷积(空间可分卷积,深度可分卷积)

平展卷积

分组卷积

特征图局部链接


传统

通道局部链接


参数量减少
Alexnet

混分组卷积

SE

Dilated Convolution

图像分割领域,图像输入到CN(典型的网络比如FCN)中有两个关键
一个是 pooling减小图像尺寸增大感受野,
另一个是 upsampling扩大图像尺寸。

在先减小再增大尺寸的过程中,肯定有一些信息损失掉了,那么能不能设计一种新的操作不通过 Pooling也能有较大的感受野看到更多的信息呢?


Resnet

Pytorch

from __future__ import print_function 
from __future__ import division

import torch.nn as nn
from torchvision import datasets, models, transforms
from torch.autograd import Variable
from PIL import Image


def set_parameter_requires_grad(model, feature_extracting):
    if feature_extracting:
        for param in model.parameters():
            param.requires_grad = False

def initialize_model(model_name, num_classes, feature_extract, use_pretrained=True):
        # Initialize these variables which will be set in this if statement. Each of these
        #   variables is model specific.
        model_ft = None
        input_size = 0

        if model_name == "resnet":
            """ Resnet18
            """
            model_ft = models.resnet18(pretrained=use_pretrained)
            set_parameter_requires_grad(model_ft, feature_extract)
            num_ftrs = model_ft.fc.in_features
            model_ft.fc = nn.Linear(num_ftrs, num_classes)
            input_size = 224

        elif model_name == "alexnet":
            """ Alexnet
            """
            model_ft = models.alexnet(pretrained=use_pretrained)
            set_parameter_requires_grad(model_ft, feature_extract)
            num_ftrs = model_ft.classifier[6].in_features
            model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
            input_size = 224

        elif model_name == "vgg":
            """ VGG11_bn
            """
            model_ft = models.vgg11_bn(pretrained=use_pretrained)
            set_parameter_requires_grad(model_ft, feature_extract)
            num_ftrs = model_ft.classifier[6].in_features
            model_ft.classifier[6] = nn.Linear(num_ftrs,num_classes)
            input_size = 224

        elif model_name == "squeezenet":
            """ Squeezenet
            """
            model_ft = models.squeezenet1_0(pretrained=use_pretrained)
            set_parameter_requires_grad(model_ft, feature_extract)
            model_ft.classifier[1] = nn.Conv2d(512, num_classes, kernel_size=(1,1), stride=(1,1))
            model_ft.num_classes = num_classes
            input_size = 224

        elif model_name == "densenet":
            """ Densenet
            """
            model_ft = models.densenet121(pretrained=use_pretrained)
            set_parameter_requires_grad(model_ft, feature_extract)
            num_ftrs = model_ft.classifier.in_features
            model_ft.classifier = nn.Linear(num_ftrs, num_classes) 
            input_size = 224

        elif model_name == "inception":
            """ Inception v3 
            Be careful, expects (299,299) sized images and has auxiliary output
            """
            model_ft = models.inception_v3(pretrained=use_pretrained)
            set_parameter_requires_grad(model_ft, feature_extract)
            # Handle the auxilary net
            num_ftrs = model_ft.AuxLogits.fc.in_features
            model_ft.AuxLogits.fc = nn.Linear(num_ftrs, num_classes)
            # Handle the primary net
            num_ftrs = model_ft.fc.in_features
            model_ft.fc = nn.Linear(num_ftrs,num_classes)
            input_size = 299

        else:
            print("Invalid model name, exiting...")
            exit()
        
        return model_ft

def extract_feature(model, imgpath):
    model.eval()        # 必须要有,不然会影响特征提取结果
    
    img=Image.open(imgpath)     # 读取图片
    img=img.resize((128, 128))
    to_tensor=transforms.ToTensor()   # 将图片转化成tensor
    tensor=to_tensor(img).cuda()    # 如果只是在cpu上跑的话要将这行去掉
    print(tensor.view(1, 3, 128, 128).shape)
    result=model(Variable(tensor.view(1, 3, 128, 128).repeat(64)))
    result_npy=result.data.cpu().numpy()    # 保存的时候一定要记得转成cpu形式的,不然可能会出错
    
    return result_npy  

if __name__=="__main__":
    # Models to choose from [resnet, alexnet, vgg, squeezenet, densenet, inception]
    model = initialize_model(model_name="vgg", num_classes=2, feature_extract=True, use_pretrained=True)
    imgpath = '/home/zut_csi/tomding/1.jpg'
    tmp = extract_feature(model, imgpath)
    print(tmp.shape)
    print(tmp)     

相关文章

  • 各种卷积简介

    3D 卷积 实际上是对一个 3D 体积执行卷积。但通常而言,我们仍在深度学习中称之为 2D 卷积。这是在 3D 体...

  • TensorFlow 实战Google深度学习框架(第2版)第六

    第六章:图像识别与卷积神经网络 * 6.1图像识别问题简介&经典数据集* 6.2卷积神经网络简介* 6.3卷积神经...

  • 视觉

    卷积神经网络整理 各种卷积神经网络变形

  • CNN网络简介

    卷积神经网络简介(Convolutional Neural Networks,简称CNN) 卷积神经网络是近年发展...

  • 卷积CNN简介

    1.颜色 2.统计不变性 3.卷积神经网络 直观感受 让我们对卷积神经网络如何工作形成更好直观感受。我们先看下人怎...

  • 一文弄懂CNN及图像识别(Python)

    一、卷积神经网络简介 卷积神经网络(Convolutional Neural Networks, CNN)是一类包...

  • 深度学习-卷积以及各种形式的卷积

    卷积也内卷,简单朴素的卷积已经不能满足人们的需求,因此出现了各种形式的卷积,比如反卷积(Deconvolution...

  • 7.cnn

    1.卷积神经网络详解 2.卷积神经网络简介 卷积神经网络由一个或多个卷积层和顶端的全连通层(也可以使用1x1的卷积...

  • CS231n 卷积神经网络: 架构, 卷积/池化层(下)

    卷积神经网络: 架构, 卷积/池化层(下) 卷积神经网络: 架构, 卷积/池化层(下)2.CNNs中的各种层(接上...

  • 基础卷积收录

    简介 卷积定义:卷积可以用来过滤一幅图像。实现过滤的方法是计算源图像与卷积内核之间的积,所谓卷积内核是指一个nxn...

网友评论

      本文标题:各种卷积简介

      本文链接:https://www.haomeiwen.com/subject/zxzfnhtx.html