torch学习二之nn.Convolution

nn.Conv1d

一维卷积通常用于处理文本数据

函数参数

首先看一下官网定义

CLASS torch.nn.Conv1d(in_channels: int, out_channels: int, kernel_size: Union[T, Tuple[T]], 
stride: Union[T, Tuple[T]] = 1, padding: Union[T, Tuple[T]] = 0, 
dilation: Union[T, Tuple[T]] = 1, groups: int = 1, bias: bool = True, padding_mode: str = 'zeros')

一般我们需要关注的是以下几个参数:

  1. int_channels:

    输入通道,在文本数据中,即词向量的维数 word_embedding_size

  2. out_channels:

    输出通道,可以认为是特征的维数,做一卷积(对应一个卷积核)可以得到一个特征,所以输出通道数决定了做卷积的
    (这里对于遍的理解看完下面的示例图就明白了)

  3. kernel_size:

    卷积核的大小,可以理解为多少个词之间进行交互
    卷积之后的维数为 ( (word_embedding_size - kernel_size) / stride + 1)
    但是一般都会做一个pooling,因为不同的卷积核最后输出的维数不同,用pooling统一,一般为max_pool,最后都是 out_channels * 1
    在这里插入图片描述此时,word_embedding_size = 10,kernel_size = 2,stride = 1

  4. stride:

    kernel 移动的步长,参照上图

  5. padding:

    由上面可知,做完一遍卷积后维数降低,如果希望维数保持不变(或自定义),可以在向量两边做padding,padding则定义了你希望在两边增加的维数,padding_mode 则定义了你希望补充的数是多少

输入数据维度转换

通常我们输入的数据格式如下:

batch_size(sentence_number) * sentence_max_length * word_embedding_size

在这里插入图片描述

但是,要明确,我们希望的卷积是在一个句子的词与词之间进行,而不是在一个句子的一个词的embedding里进行,而一维卷积是对最后一维进行的,所以需要先对tensor进行一下维度转换,使得sentence_max_length那一维是最后一维。

tensor.permute()

batch_size(sentence_number) * word_embedding_size * sentence_max_length

在这里插入图片描述

关于kernel

虽然只定义了 kernel_size,但是 kernel 并不是一维的,其实是一个二维的矩阵,大小为 kernel_size * in_channels

在这里插入图片描述
这样做完一遍卷积会得到一个channel,其维数为( (sentence_max_length - kernel_size) / stride + 1)
在这里插入图片描述

需要做 out_channels遍卷积,最终输出为:

batch_size(sentence_number) * out_channels * ((sentence_max_length - kernel_size) / stride + 1)

在这里插入图片描述
参考 : 链接

更新:对于这里 out_channel 的理解
在这里插入图片描述
图片源于:链接

nn.Conv2D

这里一般处理图片数据

基本与Conv1D类似,注意这里 kernel 大小为 kernel_size * kernel_size (或者是定义的元组的大小)

详情请看 链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值