精华内容
下载资源
问答
  • 深入理解 PyTorch 的一维卷积和二维卷积,一维池化和二维池化
    千次阅读
    2021-05-24 14:10:33

    PyTorch 的一维卷积和二维卷积的输入都可以是多维的

    默认情况下,一维卷积只对输入的最后一维进行操作,二维卷积只对输入的最后两维进行操作;

    如果想要对输入的倒数第二维度进行一维卷积,那么必须使用二维卷积进行操作,同时卷积核的第二个维度保持和输入数据的最后一个维度保持一致,这样就能保证卷积核在输入数据的倒数第二个维度上进行滑动了;

    经过这样的卷积以后,输出数据的最后一个维度会变成1,这时一般会使用 unsqueeze() 函数删除数据的最后一个维度
    上述思想对PyTroch中的一维池化和二维池化同样适用

    更多相关内容
  • 卷积神经网络包括一维卷积神经网络、二维卷积神经网络以及三维卷积神经网络。一维卷积神经网络常应用于序列类的数据处理;二维卷积神经网络常应用于图像类文本的识别;三维卷积神经网络主要应用于医学图像以及视频类...
  • 主要介绍了基于Tensorflow一维卷积用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 使用一维卷积 conv1D 和二维卷积 Conv2D 两种方法实现 MNIST 数据集分类,准确率达到 97.91%、 98.74%
  • tensorflow使用一维卷积对序列数据进行训练
  • 一维卷积代码,基本的网络结构,输入 卷积 池化 卷积 池化 输出,可实现分类的功能
  • 一维神经网络 非线性回归模型在一维卷积神经网络中的应用
  • 采用一维CNN神经网络算法,对西储大学轴承数据集分为10中故障类型进行故障识别,最终准确率很高;同时算法结构灵活,可以自定制网络及优化器,满足多张故障数据集。
  • flattened-cnn, 平坦卷积神经网络( Torch nn的一维卷积模块) 平卷积神经网络这个包有 1D 个卷积模块,在( http://arxiv.org/abs/1412.5474 ) 中使用,我们把平坦的卷积层表示为所有 3D 个方向的一个一维过滤器序列。...
  • 主要介绍了Python使用scipy模块实现一维卷积运算,结合实例形式分析了scipy模块的功能及使用scipy模块进行一维卷积运算的相关操作技巧,需要的朋友可以参考下
  • 基于matlab的一维卷积函数,不是matlab自带的,而是自己编写的,运用自己的方法实现的
  • 基于matlab的卷积函数,不是matlab自带的,而是自己编写的,运用自己的方法实现的
  • 基于一维卷积神经网络深度学习的工业过程故障检测.pdf
  • 针对故障诊断的 一维数据 进行卷积分类。 和预测
  • 基于 FFT 的卷积。 有关更多信息,请参阅 readme.txt。 如果你觉得这个软件有用,请贡献。 向 luigi.rosa@tiscali.it 报告错误 路易吉·罗莎通过中央 27 67042 Civita di Bagno 拉奎拉 --- 意大利电子邮件 luigi....
  • 文章目录一、一维卷积1.1 介绍1.2 类别1.2.1 一维Full卷积1.2.2 一维Same卷积1.2.3 一维Valid卷积1.3 具备深度的一维卷积1.4 具备深度的张量与多个卷积核的卷积二、转置卷积2.1 定义2.2 过程2.3 计算2.4 转置卷积的...

    一、一维卷积

    1.1 介绍

    一维卷积常用于序列模型,信号处理、自然语言处理领域。
    在这里插入图片描述

    1.2 类别

    一维卷积通常有三种类型**:full卷积、same卷积和valid卷积**

    1.2.1 一维Full卷积

    Full卷积的计算过程是:K沿着I顺序移动,每移动到一个固定位置,对应位置的值相乘再求和,计算过程如下:
    在这里插入图片描述
    将得到的值依次存入一维张量Cfull,该张量就是I和卷积核K的full卷积结果,其中K卷积核或者滤波器或者卷积掩码,卷积符号用符号★表示,记Cfull=I★K
    在这里插入图片描述

    1.2.2 一维Same卷积

    在这里插入图片描述
    卷积核K都有一个锚点,然后将锚点顺序移动到张量I的每一个位置处,对应位置相乘再求和,计算过程如下:
    在这里插入图片描述
    在这里插入图片描述
    假设卷积核的长度为FL,如果FL为奇数,锚点位置在(FL-1)/2处;如果FL为偶数,锚点位置在(FL-2)/2处。

    1.2.3 一维Valid卷积

    从full卷积的计算过程可知,如果K靠近I,就会有部分延伸到I之外,valid卷积只考虑I能完全覆盖K的情况,即K在I的内部移动的情况,计算过程如下:
    在这里插入图片描述
    在这里插入图片描述

    1.3 具备深度的一维卷积

    比如x是一个长度为3,深度为3的张量,其same卷积过程如下,卷积核K的锚点在张量x范围内依次移动,输入张量的深度和卷积核的深度是相等的。
    在这里插入图片描述

    1.4 具备深度的张量与多个卷积核的卷积

    上面介绍了一个张量和一个卷积核进行卷积。他们的深度相等才能进行卷积,下面介绍一个张量与多个卷积核的卷积。同一个张量与多个卷积核的卷积本质上是该张量分别与每一个卷积核卷积,然后将每一个卷积结果在深度方向上连接起来。

    举例:以长度为3、深度为3的输入张量与2个长度为2、深度为3的卷积核卷积为例,过程如下:
    在这里插入图片描述

    二、转置卷积

    2.1 定义

    之所以叫转置卷积是因为,它其实是把我们平时所用普通卷积操作中的卷积核做一个转置,然后把普通卷积的输出作为转置卷积的输入。而转置卷积的输出,就是普通卷积的输入。

    卷积操作的本质其实就是在input矩阵和kernel矩阵之间做逐元素(element-wise)的乘法然后求和。

    根据反卷积的数学含义,通过反卷积可以将通过卷积的输出信号,完全还原输入信号。转置卷积只能还原shape大小,而不能还原value(愿意:神经网络是基于概率;反向传播损失不会等于0,只能与真实值接近)。所以说转置卷积与真正的反卷积有点相似,因为两者产生了相同的空间分辨率。

    转置卷积的过程中图像上采样,越来越大,通道越来越浅。需要注意的是,转置前后padding,stride仍然是卷积过程指定的数值,不会改变

    转置卷积一般会放大图像,也称为上采样过程,而卷积一般是缩小图像,也称为下采样过程。

    2.2 过程

    在这里插入图片描述
    卷积操作是多对一(many-to-one)的映射关系。
    在这里插入图片描述
    转置卷积是多对一(one-to-many)的映射关系

    反卷积的运作过程:
    在这里插入图片描述
    在这里插入图片描述

    2.3 计算

    步长=1时,外圈padding=k-1
    步长>1时,外圈padding-k-1,内圈out_padding=s-1
    转置卷积后的特征图计算公式:s*(N-1)+k-2p
    在这里插入图片描述
    在这里插入图片描述

    2.4 转置卷积的缺点

    (1)卷积矩阵是稀疏的,因此大量的信息是无用的;
    (2)求卷积矩阵的转置矩阵是非常耗费计算资源的。

    2.5 转置卷积的棋盘效应

    当我们要用到深度学习来生成图像的时候,是往往是基于一个低分辨率且具有高层语义的图像。这会使得深度学习来对这种低分辨率图像进行填充细节。一般来说,为了执行从低分辨率图像到高分辨率图像之间的转换,我们往往要进行deconvolution。简单来说,deconvolution layer可以允许模型通过每一个点进行绘制高分辨率图像上的一个方块,这种情况的产生与deconvolution的stride、kernel size有关

    转置卷积会在生成的图像中造成棋盘效应(checkerboard artifacts).本文推荐在使用转置卷积进行上采样操作之后再过一个普通的卷积来减轻此类问题.

    2.5.1 产生原因

    kernel size无法被stride整除
    stride为1,kernel size为3,这导致了重复上采样绘图的部分不均匀(下图深色部分),
    在这里插入图片描述
    二维情况更为严重,
    在这里插入图片描述

    2.5.2 解决方案:

    思路一:确保反卷积核的大小可以被步长整除,从而避免重叠问题
    (1)多层重复转置卷积
    一个常见的想法是寄希望于多层重复转置卷积,希望能抵消掉棋盘效应,但是实际上一般事与愿违,重复的结构使得棋盘更加复杂。
    在这里插入图片描述
    (2)网络末尾使用1x1的反卷积,可以稍微抑制棋盘效应
    在这里插入图片描述
    (3)调整kernel权重分布
    加大无重叠部分的权重分布可以很好的解决的这个问题,原理如下图:
    在这里插入图片描述
    但是这种做法会极大地限制模型的学习能力(避免棋盘效应往往会降低模型容量,会使得模型变得更大从而使得难以训练。原文的话是指: Avoiding artifacts significantly restricts the possible filters, sacrificing model capacity)
    (4)采取可以被stride整除的kernel size
    该方案较好的应对了棋盘效应问题,但是仍不够圆满,因为一旦我们的kernel学习不均匀,仍然会产生棋盘效应,
    在这里插入图片描述
    在上图中,我们的weight并不够平衡,这直接导致了输出的棋盘效应。
    即便如此,采用这个思路去设计网络仍然是必要的。

    思路二:更好的上采样(将上采样分离为较高分辨率的卷积到计算特征)
    (5)插值
    可以直接进行插值resize(使用最近邻插值或双线性插值)操作,然后再进行卷积操作。这种操作在超分辨率文献中很常见。例如,我们可以采取近邻插值或者样条插值来进行上采样。
    在这里插入图片描述

    三、一维卷积应用场景

    众所周知,一维卷积常用来处理序列模型,通过训练好的一维卷积模型可以在前面数据的基础上预测下一时刻的信号。在这里,我用一维卷积处理了两地之间电力传输的信号,通过训练好的模型可以有效预测下一时刻的电信号,从而判断当前信号是否符合标准。

    四、转置卷积应用场景

    对于上采用的需求
    (1)当我们用神经网络生成图片的时候,经常需要将一些低分辨率的图片转换为高分辨率的图片。
    (2)在DCGAN中的生成器将会用随机值转变为一个全尺寸(full-size)的图片,这个时候就需要用到转置卷积。
    (3)在语义分割中,会使用卷积层在编码器中进行特征提取,然后在解码层中进行恢复为原先的尺寸,这样才可以对原来图像的每个像素都进行分类。这个过程同样需要用到转置卷积。

    五、代码

    5.1 net.py

    一维卷积模型

    import torch.nn as nn
    
    class Net(nn.Module):
        def __init__(self):
            super(Net,self).__init__()
            self.conv1 = nn.Sequential(
                nn.Conv1d(1,32,3,2,1),
                nn.BatchNorm1d(32),
                nn.ReLU()#5
            )
            self.conv2 = nn.Sequential(
                nn.Conv1d(32,64,3,2,1),
                nn.BatchNorm1d(64),
                nn.ReLU()#3
            )
            self.conv3 = nn.Sequential(
                nn.Conv1d(64,128,3,1,0),
                # nn.BatchNorm1d(128),
                nn.ReLU()#1
            )
            self.fc = nn.Sequential(
                nn.Linear(128,1),
                nn.Sigmoid()#1
            )
        def forward(self, x):
            y1 = self.conv1(x)
            y2 = self.conv2(y1)
            y3 = self.conv3(y2)
            y3 = y3.reshape(-1,128)
            y4 = self.fc(y3)
            return y4
    

    GRU(循环神经网络,LSTM的变体)

    class rnn_net(nn.Module):
        def __init__(self):
            super().__init__()
            self.lstm = nn.GRU(
                input_size=9,
                hidden_size=128,
                num_layers=1,
                batch_first=True,
                bidirectional=True
            )
            self.out = nn.Linear(128 *2, 1)
        def forward(self, x):
            y, (c_s, h_s) = self.lstm(x, None)
            # print(y.shape)
            # print(c_s.shape)
            # print(h_s.shape)
            out = self.out(y[:, -1, :])
            # print(out.shape)
            return out
    
    

    5.2 sample_train

    import random
    import numpy as np
    import torch
    def Get_data():
        data = torch.randint(10, 100, (100,), dtype=torch.float32)
        data2 = torch.randint(-3, 3, (100,), dtype=torch.float32)
        test_data = data + data2
        return test_data
    
    
    

    5.3 Train.py

    训练时我用长度为9的一维信号输入网络得到一个长度为1的信号,再将它与标签信号做损失在优化

    import torch
    import torch.nn as nn
    import numpy as np
    import sample_train
    import net
    import matplotlib.pyplot as plt
    import os
    
    if __name__=="__main__":
        epohs = 1000
        net = net.Net().cuda()
        save_path = r"params/1dnet.pth"
        opt = torch.optim.Adam(net.parameters())
        loss_fn = nn.BCELoss()
        get_data = sample_train.Get_data()
        max_data = float(torch.max(get_data))
        data = np.array(get_data) / max_data
        if os.path.exists(save_path):
            net.load_state_dict(torch.load(save_path))
        else:
            print("NO Param")
        for epoh in range(epohs):
            a=[]
            b=[]
            c=[]
            for i in range(0,len(data)-9):
                x = data[i:i+9]
                # print(x)
                y = torch.tensor(data[i+9:i+10],dtype=torch.float32).cuda()
                xs = torch.tensor(x.reshape(-1,1,9),dtype=torch.float32).cuda()
                out = net(xs)
                output=out[0]
                loss = loss_fn(output,y)
                opt.zero_grad()
                loss.backward()
                opt.step()
                a.append(i)
                b.append(out.item())
                c.append(y.item())
                plt.plot(a,b,"red",label="data")
                plt.plot(a,c,"blue",label="label")
                plt.legend(loc="upper left")
                plt.pause(0.01)
                plt.clf()
                print("epoh:{} loss:{}".format(epoh,loss.item()))
    
                # torch.save(net.state_dict(),save_path)
            plt.savefig("img/{}-figure".format(epoh))
    

    5.4 信号拟合效果展示

    这里要说的是,GRU相较于普通的一维卷积能更快地达到拟合效果。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 目录概述一维卷积二维卷积二维单通道卷积二维多通道卷积三维卷积三维单通道卷积三维多通道卷积深度可分离卷积常规卷积深度可分离卷积参考链接 概述 不同维度的卷积实际上是卷积核的自由度不同,一维卷积卷积核只能在...

    概述

    不同维度的卷积实际上是卷积核的自由度不同,一维卷积卷积核只能在长度方向上进行滑窗操作,二维卷积可以在长和宽方向上进行滑窗操作,二维卷积可以在长、宽以及channel方向上进行滑窗操作。
    一个卷积核运算一次得到一个值,output channel取决于卷积核的个数。

    一维卷积

    二维卷积

    在卷积操作中我们只能限制卷积核的维度,卷积核的参数均是根据网络自主学习到的。
    在这里插入图片描述

    二维单通道卷积

    在这里插入图片描述

    二维多通道卷积

    在这里插入图片描述

    三维卷积

    三维单通道卷积

    这里的三维输出不是多通道导致的,而是由于卷积核在第三个维度上进行滑窗得到的(对于视频信号可能是视频的长度)。
    在这里插入图片描述

    三维多通道卷积

    三维多通道的卷积核也是三维的,因此三维数据不同channel上权重是相同的,这点和二维多通道卷积不同。

    在这里插入图片描述

    深度可分离卷积

    常规卷积

    在这里插入图片描述

    深度可分离卷积

    在这里插入图片描述
    在这里插入图片描述
    参数对比
    回顾一下,常规卷积的参数个数为:
    N_std = 4 × 3 × 3 × 3 = 108

    Separable Convolution的参数由两部分相加得到:
    N_depthwise = 3 × 3 × 3 = 27
    N_pointwise = 1 × 1 × 3 × 4 = 12
    N_separable = N_depthwise + N_pointwise = 39

    相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深

    参考链接

    理解卷积
    深度可分离卷积

    展开全文
  • 一维卷积神经网络实时抗噪故障诊断算法.pdf
  • 基于一维卷积神经网络的钻杆故障诊断.pdf
  • 二维卷积与一维卷积区别

    千次阅读 2019-05-14 14:09:49
    卷积神经网络常用在图像处理与语音识别领域,它与全连接网络不同的是,网络结构中加入了卷积层和池化层,并且神经元之间是局部连接,即每个神经元只与上层的部分神经元相连,这样就减少了许多权重和偏置参数。...

    卷积神经网络常用在图像处理与语音识别领域,它与全连接网络不同的是,网络结构中加入了卷积层和池化层,并且神经元之间是局部连接,即每个神经元只与上一层的部分神经元相连,这样就减少了许多权重和偏置参数。其次,它遵循权值共享机制,即一组连接可以共享同一个权重,而不是每个连接有不同权重。再次,卷神经网络可以采用下采样或者池化层来减少每层样本数,剔除与样本无关的特征信息,进一步减少了网络参数。所以综合卷积神经网络的这三个特性,卷积网络在模型训练速度上快于全连接网络,且能更好的处理时序特征。

    卷积网络和全连接网络也存在一定联系,卷积网络经过一层或多层的卷积、池化操作后,通常会连接一个或多个隐藏层,用以抓取更深层次特征,且隐藏层还可以将最后的输出映射到线性可分空间,配合输出层进行分类或预测,获得更强的识别能力。可以发现,卷积网络中的隐藏层和最后输出层的组合其实就是除去输入层的全连接网络。

    卷积网络中的常用参数有kernel_size,stride,filters,pooling_type,padding等,其中kernel_size表示的是卷积核的大小,stride表示卷积核移动的步长,filters表示的是滤波器的个数也叫卷积核个数,pooling_type指的是池化类型,通常有平均池化(average pooling)和最大池化(max pooling)。以二维卷积(conv2d)为例,如公式4.6所示。

                                                                                          (4.6)

    其中为给定矩阵的大小, 为卷积核尺寸。

    二维卷积和池化的过程如图4.4所示。

                                                                            图4.4二维卷积和池化过程

    图中kernel_size是(2×2) 的卷积核,第一个卷积核权重为W1W2W3W4 ,一共有k个卷积核即filters=k,每个卷积核对应的偏置为b1b2bk ,输入input为(3×4) 的矩阵,其中宽度width=4,height=3。stride为1表示卷积核每次在width方向和height方向移动1步。以第一个卷积核为例,则输入类型为(3×4) 的矩阵经过二维卷积后变成了一个(2×3) 的特征矩阵(feature map),矩阵中每个元素的值为:

                                                        

                                                              

    由此可见,输出值是共享了第一个卷积核的权重和偏置,而k个卷积核的权重和偏置可能不同,所以k个卷积核产生k个不同的feature map。

    池化过程则是进一步减少特征值的过程,池化包括最大池化(max pooling)和平均池化(average pooling),如图4.4所示,假设池化类型是(2×2)的max pooling,stride=1,则上一层的feature map经过池化后变成了一个(1×2)的feature map,且每个元素的值为:

                                                           

    若是经过(2×2) 的average pooling,则每个元素的值为:

                   

    Padding参数的意义在于控制feature map的尺寸,在CNN中它有两种方式,valid和same。在卷积核进行滑窗操作的时候,经常会出现数据的width和height达不到卷积核的大小的情况,当padding=’valid’时,处理这种情况是直接将达不到卷积核大小的数据舍弃掉,而padding=’same’时,则是将0填充到卷积核中以达到卷积核尺寸从而继续进行卷积操作。可以看出padding=’valid’时,数据尺寸明显减少。

    综上,输入特征经过卷积和池化后,feature map维度明显减少,得到更有效的特征值,一定程度上缓解了过拟合,这也说明了卷积网络训练速度之快。经过若干卷积层和池化层后,会将输出向量(二维)平摊(flatten)成一个一维向量,然后再送入到若干隐藏层并配合输出层进行识别。后续的计算原理与全连接网络一样,不再赘述。

    以上是二维卷积网络结构,输入的是二维矩阵,这种结构经常用在图像识别上,因为图像有宽(width)和高(height)两个像素,但是对于语音这种时序信号,二维卷积网络往往不是很友好,所以通常采用一维卷积网络进行训练。一维卷积(conv1d)的过程是卷积核只在一个方向上进行滑窗操作,即在width方向或height方向上进行加权求和。一维卷积网络的卷积和池化过程如图4.5所示。

                                                                         图4.5一维卷积和池化过程

    首先输入数据input仍然是为(3×4)的矩阵,卷积核大小kernel_size为2,即它的高(height)为2,stride为1,卷积核个数为k。conv1d滑窗操作实际上是一个以kernel_size为高,输入数据维度为宽的卷积核向height方向加权求和的过程,如图,当输入数据经过第一个卷积核的滑窗操作后转变成了一个(2×1)的列向量,其中:

                                                 

    同理,k个卷积核进行滑窗操作形成k个(2×1)的列向量,即形成(2×k)的feature map(k维矩阵)。

    池化过程的滑窗操作与卷积类似,假设pool_size为2,即相当于一个height为2,width为经过一个卷积核卷积后的数据维度即为1,所以经过最大池化和平均池化后,分别形成了一个(1×1)的向量:

                                                                                                    

    一维卷积输出k个(2×1)的列向量经过池化后也会形成k个列向量,将这k个列向量拼接在一起,所以最大池化和平均池化最后形成的矩阵尺寸是(1×k) 。

    展开全文
  • 什么是卷积,一维卷积,二维卷积,三维卷积

    千次阅读 多人点赞 2019-11-17 21:32:17
    2、一维卷积 3、通道 3.1若输入数据的通道数为3则 3.2三通道二维卷积 4、多个滤波器 5、三维卷积 6、一维卷积用于: 自然语言处理(近义词反义词个数channel,词向量大小size,(chanel,size)) 二维卷...
  • CNN0926_一维卷积_matlab1D-CNN_源码.zip
  • 一维卷积】【二维卷积】一维卷积物理意义数学意义二维卷积二维卷积的实现预处理滚动卷积运算Matlab代码 一维卷积 物理意义 这里主要参考b站《「珂学原理」No. 28「卷积为谁而生?」》,这里就直接放推导过程了。 ...
  • 基于多尺度一维卷积神经网络的光纤振动事件识别.pdf
  • 基于一维卷积神经网络的地铁钢轨波磨识别方法.pdf
  • 基于一维卷积神经网络的燃气管道泄漏声发射信号识别.pdf
  • 一维卷积,二维卷积,三维卷积

    千次阅读 2020-09-17 16:09:30
    一维卷积神经网络(1D-CNN) 一维卷积常用在序列模型、自然语言处理领域; 假设输入数据维度为8,filter维度为5; 不加padding时,输出维度为4,如果filter的数量为16,那么输出数据的shape就是; 二维卷积...
  • tensorflow一维卷积神经网络

    千次阅读 2022-03-14 15:02:53
    卷积神经网络一般用来处理图像信息,对于序列这种一维的数据而言,我们就得采用一维卷积,tensorflow中提供有专用的函数conv1d,各参数的使用说明如下: conv1d参数 说明 value 输入数据,value的格式为:...
  • 下面我所写的是卷积神经网络中的一维卷积,其整体思想差不多。 卷积的定义 卷积(Convolution),也叫做褶积,是分析数学的一种重要的运算,在信号处理和图像处理中,经常使用一维或者二位卷积[1]。 一维卷积 一维卷积...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,292
精华内容 35,716
关键字:

一维卷积