精华内容
下载资源
问答
  • pytorch之nn.Conv1d详解

    万次阅读 多人点赞 2018-10-08 16:35:12
    之前学习pytorch用于文本分类的时候,用到了一维卷积,花了点时间了解其中的...class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) in_channe...

    博主欢迎转载,但请一定要给出原文链接,标注出处!!!谢谢~

    pytorch之nn.Conv1d详解

    (没想到当初整理这篇,竟然有那么多人看,而且还有不少人提问。由于CSDN不常登陆,所以评论不一定及时回复。大家如果用知乎的话,可以知乎私信我:Sunny.夏的知乎个人主页。我看到消息肯定会及时回复大家的。对于那些评论了几个月博主都没回的,实在抱歉,千万别拿大刀砍我。。。我是真的不常登,只有在写文章的时候才会登下博客)

    之前学习pytorch用于文本分类的时候,用到了一维卷积,花了点时间了解其中的原理,看网上也没有详细解释的博客,所以就记录一下。

    Conv1d

    class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

    • in_channels(int) – 输入信号的通道。在文本分类中,即为词向量的维度
    • out_channels(int) – 卷积产生的通道。有多少个out_channels,就需要多少个1维卷积
    • kernel_size(int or tuple) - 卷积核的尺寸,卷积核的大小为(k,),第二个维度是由in_channels来决定的,所以实际上卷积大小为kernel_size*in_channels
    • stride(int or tupleoptional) - 卷积步长
    • padding (int or tupleoptional)- 输入的每一条边补充0的层数
    • dilation(int or tuple, `optional``) – 卷积核元素之间的间距
    • groups(intoptional) – 从输入通道到输出通道的阻塞连接数
    • bias(booloptional) - 如果bias=True,添加偏置

    举个例子:

    conv1 = nn.Conv1d(in_channels=256,out_channels=100,kernel_size=2)
    input = torch.randn(32,35,256)
    # batch_size x text_len x embedding_size -> batch_size x embedding_size x text_len
    input = input.permute(0,2,1)
    out = conv1(input)
    print(out.size())
    

    这里32为batch_size,35为句子最大长度,256为词向量

    再输入一维卷积的时候,需要将32*35*256变换为32*256*35,因为一维卷积是在最后维度上扫的,最后out的大小即为:32*100*(35-2+1)=32*100*34

    附上一张图,可以很直观的理解一维卷积是如何用的:

    图片来源:Keras之文本分类实现

    图中输入的词向量维度为5,输入大小为7*5,一维卷积和的大小为2、3、4,每个都有两个,总共6个特征。

    对于k=4,见图中红色的大矩阵,卷积核大小为4*5,步长为1。这里是针对输入从上到下扫一遍,输出的向量大小为((7-4)/1+1)*1=4*1,最后经过一个卷积核大小为4的max_pooling,变成1个值。最后获得6个值,进行拼接,在经过一个全连接层,输出2个类别的概率。

    附上一个代码来详解:

    其中,embedding_size=256, feature_size=100, window_sizes=[3,4,5,6], max_text_len=35

    class TextCNN(nn.Module):
        def __init__(self, config):
            super(TextCNN, self).__init__()
            self.is_training = True
            self.dropout_rate = config.dropout_rate
            self.num_class = config.num_class
            self.use_element = config.use_element
            self.config = config
    
            self.embedding = nn.Embedding(num_embeddings=config.vocab_size, 
                                    embedding_dim=config.embedding_size)
            self.convs = nn.ModuleList([
                    nn.Sequential(nn.Conv1d(in_channels=config.embedding_size, 
                                            out_channels=config.feature_size, 
                                            kernel_size=h),
    #                              nn.BatchNorm1d(num_features=config.feature_size), 
                                  nn.ReLU(),
                                  nn.MaxPool1d(kernel_size=config.max_text_len-h+1))
                         for h in config.window_sizes
                        ])
            self.fc = nn.Linear(in_features=config.feature_size*len(config.window_sizes),
                                out_features=config.num_class)
            if os.path.exists(config.embedding_path) and config.is_training and config.is_pretrain:
                print("Loading pretrain embedding...")
                self.embedding.weight.data.copy_(torch.from_numpy(np.load(config.embedding_path)))    
        
        def forward(self, x):
            embed_x = self.embedding(x)
            
            #print('embed size 1',embed_x.size())  # 32*35*256
    # batch_size x text_len x embedding_size  -> batch_size x embedding_size x text_len
            embed_x = embed_x.permute(0, 2, 1)
            #print('embed size 2',embed_x.size())  # 32*256*35
            out = [conv(embed_x) for conv in self.convs]  #out[i]:batch_size x feature_size*1
            #for o in out:
            #    print('o',o.size())  # 32*100*1
            out = torch.cat(out, dim=1)  # 对应第二个维度(行)拼接起来,比如说5*2*1,5*3*1的拼接变成5*5*1
            #print(out.size(1)) # 32*400*1
            out = out.view(-1, out.size(1)) 
            #print(out.size())  # 32*400 
            if not self.use_element:
                out = F.dropout(input=out, p=self.dropout_rate)
                out = self.fc(out)
            return out

    embed_x一开始大小为32*35*256,32为batch_size。经过permute,变为32*256*35,输入到自定义的网络后,out中的每一个元素,大小为32*100*1,共有4个元素。在dim=1维度上进行拼接后,变为32*400*1,在经过view,变为32*400,最后通过400*num_class大小的全连接矩阵,变为32*2。

    展开全文
  • nn.Conv2d卷积

    万次阅读 多人点赞 2019-03-09 14:52:42
    一、nn.Conv2d nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)) 参数: in_channel:输入数据的通道数,例RGB图片通道数为3; out_channel: 输.....

    学习torch框架中的卷积神经网络,对此进行记录

    一、nn.Conv1d

    一维的卷积能处理多维数据

    1. nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
      参数:
        in_channel: 输入数据的通道数,例RGB图片通道数为3;
        out_channel: 输出数据的通道数,这个根据模型调整;
        kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小2, kennel_size=(2,3),意味着卷积在第一维度大小为2,在第二维度大小为3;
        stride:步长,默认为1,与kennel_size类似,stride=2,意味在所有维度步长为2, stride=(2,3),意味着在第一维度步长为2,意味着在第二维度步长为3;
        padding: 零填充
    2. 例子
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    
    x = torch.randn(10, 16, 30, 32, 34)
    # batch, channel , height , width
    print(x.shape)
    class Net_1D(nn.Module):
        def __init__(self):
            super(Net_1D, self).__init__()
            self.layers = nn.Sequential(
                nn.Conv1d(in_channels=16, out_channels=16, kernel_size=(3, 2, 2), stride=(2, 2, 1), padding=[2,2,2]),
                nn.ReLU()
            )
        def forward(self, x):
            output = self.layers(x)
            log_probs = F.log_softmax(output, dim=1)
            return  log_probs
    
    n = Net_1D()  # in_channel,out_channel,kennel,
    print(n)
    y = n(x)
    print(y.shape)
    

    结果:

    torch.Size([10, 16, 30, 32, 34])
    Net_1D(
      (layers): Sequential(
        (0): Conv1d(16, 16, kernel_size=(3, 2, 2), stride=(2, 2, 1), padding=[2, 2, 2])
        (1): ReLU()
      )
    )
    torch.Size([10, 16, 16, 18, 37])
    
    1. 卷积计算
      d = (d - kennel_size + 2 * padding) / stride + 1
      x = ([10,16,30,32,34]),其中第一维度:30,第一维度,第二维度:32,第三维度:34,对于卷积核长分别是;对于步长分别是第一维度:2,第二维度:,2,第三维度:1;对于padding分别是:第一维度:2,第二维度:,2,第三维度:2;
      d1 = (30 - 3 + 22)/ 2 +1 = 31/2 +1 = 15+1 =16
      d2 = (32 - 2 + 2
      2)/ 2 +1 = 34/2 +1 = 17+1 =18
      d3 = (34 - 2 + 2*2)/ 1 +1 = 36/1 +1 = 36+1 =37
      batch = 10, out_channel = 16

    故:y = [10, 16, 16, 18, 37]

    二、nn.Conv2d

    二维卷积可以处理二维数据

    1. nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
      参数:
        in_channel: 输入数据的通道数,例RGB图片通道数为3;
        out_channel: 输出数据的通道数,这个根据模型调整;
        kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小(2,2), kennel_size=(2,3),意味着卷积大小(2,3)即非正方形卷积
        stride:步长,默认为1,与kennel_size类似,stride=2,意味着步长上下左右扫描皆为2, stride=(2,3),左右扫描步长为2,上下为3;
        padding: 零填充
    2. 例子
      输入数据X[10,16,30,32],其分别代表:10组数据,通道数为16,高度为30,宽为32
    import torch
    import torch.nn as nn
    
    x = torch.randn(10, 16, 30, 32) # batch, channel , height , width
    print(x.shape)
    m = nn.Conv2d(16, 33, (3, 2), (2,1))  # in_channel, out_channel ,kennel_size,stride
    print(m)
    y = m(x)
    print(y.shape)
    

    结果:

    torch.Size([10, 16, 30, 32])
    Conv2d(16, 33, kernel_size=(3, 2), stride=(2, 1))
    torch.Size([10, 33, 14, 31])
    

    3.卷积计算过程:
    h/w = (h/w - kennel_size + 2padding) / stride + 1
    x = ([10,16,30,32]),其中h=30,w=32,对于卷积核长分别是 h:3,w:2 ;对于步长分别是h:2,w:1;padding默认0;
    h = (30 - 3 + 2
    0)/ 2 +1 = 27/2 +1 = 13+1 =14
    w =(32 - 2 + 2*0)/ 1 +1 = 30/1 +1 = 30+1 =31
    batch = 10, out_channel = 33
    故: y= ([10, 33, 14, 31])

    展开全文
  • 通用卷积的输出计算 SAME CONV VALID CONV

    通用卷积的输出计算

    通用输出计算公式

    SAME CONV

    在这里插入图片描述

    VALID CONV

    在这里插入图片描述

    展开全文
  • 解决sdk tools运行缺少hprof-conv文件

    万次下载 热门讨论 2014-07-23 20:20:06
    hprof-conv.exe 关于sdk tools 里面缺少这个运行文件
  • conv1d输入数据格式为(batch_size, channel, length)nn.conv1d(in_channels, outchannel, kernel_size, stride=1,padding=0,dilation=1,groups=1)nn.Conv1d(1, 20, 5)表示输入1通道,20个卷积核,核大小为5conv2d...

    conv1d

    输入数据格式为(batch_size, channel, length)

    nn.conv1d(in_channels, outchannel, kernel_size, stride=1,padding=0,dilation=1,groups=1)

    nn.Conv1d(1, 20, 5)表示输入1通道,20个卷积核,核大小为5

    conv2d

    输入数据格式为(batch_size, channel, Height, Width),

    nn.conv2d(in_channels,out_channels,kernel_size, stride=(1,1),padding=0,dilation=(1,1),groups=1)

    nn.Conv2d(1, 20, (3, 3), stride=(1, 1),padding=(2,2)) 表示输入1通道,20个卷积核,核大小为(3*3)

    针对conv2d , 输入的是4维,[150,103,7,7]

    conv3d

    输入数据格式为(batch_size, channel, Depth, Height, Width)

    nn.conv2d(in_channels,out_channels,kernel_size, stride=(1,1,1),padding=0,dilation=(1,1,1),groups=1)

    nn.Conv3d(1, 90, (24, 3, 3), stride=(9,1,1),padding=(1,1,1))

    8fb0667a849a6aa65e9237fdc7b6beb3.png

    输入的是5维,150是batch_size,1是增加的维度,103是brand波段,7*7是patch_size.

    FC

    nn.Linear(input_channels, outpout_channels)

    要求数据输入格式为(batch_size, length),

    68f77796ced84624678d348f5863300d.png

    150是batch_size, 103是波段, 没有patch_size,以单个像素作为输入。

    总结

    在本地的实验中,当patch>1时,data = data.unsqueeze(0), 增加一维,变成四维数据(Planes x Channels x Width x Height),Planes=1, channels=波段。dataloader之后,变成五维数据,((Batch x) Planes x Channels x Width x Height)。因此nn.Conv3d(1, 90, (24, 3, 3)),输入通道是1.

    当输入网络是conv2d时,拿到五维数据,((Batch x) Planes x Channels x Width x Height),其中Planes=1。此时需要x = x.squeeze(). 把Planes去掉,变成((Batch x) Channels x Width x Height)然后nn.Conv2d(input_channels, 80, (3, 3)),其中input_channels就是波段数量。

    展开全文
  • 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )

    万次阅读 多人点赞 2018-06-06 14:31:32
    最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2这个方法,查阅了官网的API 发现讲得比较简略,还是没理解。google了一下,参考了网上一些朋友写得博客,结合自己的理解,差不多整明白了。 ...
  • tf.layer.conv1d、conv2d、conv3d

    千次阅读 2019-03-11 00:00:27
    下面我都是抄的,如果说是正确,那么conv3d...tensorflow中的conv1d和conv2d的区别:conv1d是单通道的,conv2d是多通道,所以conv1d适合处理文本序列,conv2d适合处理图像。 conv1d import tensorflow as tf inpu...
  • PyTorch:学习conv1D,conv2D和conv3D

    千次阅读 多人点赞 2020-03-06 18:16:10
    背景 CNN是深度学习的重中之重,而conv1D,conv2D,和conv3D又是CNN的核心,所以理解conv的工作原理就变得尤为重要。在本博客中,将简单梳理一下这三种卷积,以及在PyTorch中的具体实现。 参考 ...
  • <div><p>Found this while searching for how to deploy keras trained models ...Any plans for supporting Conv2DTranpose and depth-wise conv</p><p>该提问来源于开源项目:Dobiasd/frugally-deep</p></div>
  • 将net_add_conv5_conv6_py 换成 net_conv1_conv2_conv3_conv4_py score : 82.21 flyai.exe train -p=1 -b=64 -e=6000 score : 85.15 修改模型保存方式,将 # 若测试准确率高于当前最高准确率,则保存模型 ...
  • darknet.conv

    2018-04-17 10:57:40
    darknet.conv.weights darknet.conv.weights darknet.conv.weights
  • EfficenrNet代码中(torch),出现了两个函数,Conv2dStaticsSamePadding(nn.Conv2d)和 Conv2dDynamicSamePadding(nn.Conv2d)。 每个函数都有两步作用: padding + Conv Conv2dStaticsSamePadding(nn.Conv2d)函数的...
  • self.conv1b(self.conv1aa(self.conv1a(im1))) c21 = self.conv1b(self.conv1aa(self.conv1a(im2))) c12 = self.conv2b(self.conv2aa(self.conv2a(c11))) c22 = self.conv2b(self.conv2aa(self.conv...
  • 主要介绍了基于Keras中Conv1D和Conv2D的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • pytorch中的Conv1d、Conv2d、Conv3d

    千次阅读 2019-09-11 15:57:51
    一、一维卷积 Conv1d 一维卷积常用于序列模型,自然语言处理领域。 输入输出数据格式: in/out:(batch_size , channel , length) torch.nn.modules.conv.Conv1d def __init__(self, in_channels: int, out_...
  • conv_offset

    2018-08-06 21:14:32
    conv的源码注释 添加了很多代码说明 还有待修改 得到自己设计的conv
  • hprof-conv

    2018-12-28 15:53:53
    解决ubuntu 上Andrid stutidon sdk tools运行缺少hprof-conv文件,直接下载解压,放入sdk/tools/目录下,使用chmod 777 hprof-conv(可读可写可执行);
  • conv函数

    千次阅读 2019-10-07 09:54:53
    conv函数 目录 一、概念 二、参数 三、用例 四、拓展 一、概念 MySQL CONV()将一个数字从一个数字基数系统转换为另一个数字基数系统。转换后,函数返回数字的字符串表示形式。 当定义的参数为NULL时,...
  • 今天我们对比Conv1D和Conv2D实现文本卷积,提前说明两种方式实现的运算是一样的。两种实现方式的原理图对比输入数据的形状对比Conv1D (batch, steps, channels),steps表示1篇文本中含有的单词数量,channels表示1个...
  • Fix metal conv

    2021-01-04 12:02:09
    metal平台depthwise conv、winograd convconv1x1计算结果不正确的问题. 目前depthwise convconv1x1不再需要循环遍历batch和group维度</p><p>该提问来源于开源项目:Tencent/TNN</p></div>
  • <div><p>In this diff we would like to fuse conv2d prepack into conv2d it self. Later we will only need to deal with two kinds of conv2d: already packed conv2d, then first unpack them; or fused conv2d,...
  • Conv2d,Conv1d 或 Conv3d 卷积核里的权值以及偏置是随机的,每次使用的权值和偏置都不一样。
  • PSPNet final conv

    2021-01-07 08:23:34
    <p>are you sure that the final conv layer of your PSPNet implementation is correct? <pre><code>model = PSPNet(backbone_name = 'resnet18', final_interpolation = 'bilinear',...
  • tensorflow中的conv1d和conv2d

    千次阅读 2019-02-25 20:21:07
    tensorflow中的conv1d和conv2d的区别:conv1d是单通道的,conv2d是多通道,所以conv1d适合处理文本序列,conv2d适合处理图像。 conv1d import tensorflow as tf input = tf.Variable(tf.random_normal([1...
  • conv2d

    千次阅读 2018-01-15 13:14:42
    在查看代码的时候,看到有代码用到卷积层是tf.nn.conv2d,但是也有的使用的卷积层是tf.contrib.slim.conv2d,这两个函数调用的卷积层是否一致,在查看了API的文档,以及slim.conv2d的源码后,做如下总结: ...
  • Conv2D

    2019-09-26 02:40:55
    Conv2D keras.layers.convolutional.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_...
  • Deformable Conv

    千次阅读 2018-08-26 10:09:11
    并没有对conv函数做什么变化,而是在普通的input map 和 conv之间,多做了一次conv得到input_offset map,再加上原input map,得到偏移后的新的input map pixel coor。( 这里要用到一下双线性插值) 以...
  • 前言这两天写序列方面的网络代码,要用到 ,之前只用过 ,本来觉得原理应该很好理解,但是在网上看了一些博客后反而感觉云里雾里。...2 keras中的参数对比kernel_size:卷积核的尺寸在Conv2D中,是一个二维的元...
  • Conv2d tests

    2021-01-07 05:38:36
    <div><p>Unit tests for the conv2d class and make_random_conv2D method (see issue #280). Also made conv2d PEP8 compliant. <p>I'm using <code>scipy.ndimage</code>'s convolution method to verify ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,874
精华内容 7,149
关键字:

conv