torch学习二之nn.Convolution

  • nn.Conv1d
  • 函数参数
  • 输入数据维度转换
  • 关于kernel
  • nn.Conv2D


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
  4. resnet一维卷积 torch一维卷积_卷积

  5. 此时,word_embedding_size = 10,kernel_size = 2,stride = 1
  6. stride:
    kernel 移动的步长,参照上图
  7. padding:
    由上面可知,做完一遍卷积后维数降低,如果希望维数保持不变(或自定义),可以在向量两边做padding,padding则定义了你希望在两边增加的维数,padding_mode 则定义了你希望补充的数是多少

输入数据维度转换

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

batch_size(sentence_number) * sentence_max_length * word_embedding_size

resnet一维卷积 torch一维卷积_卷积_02

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

tensor.permute()

batch_size(sentence_number) * word_embedding_size * sentence_max_length

resnet一维卷积 torch一维卷积_数据_03

关于kernel

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

resnet一维卷积 torch一维卷积_数据_04


这样做完一遍卷积会得到一个channel,其维数为( (sentence_max_length - kernel_size) / stride + 1)

resnet一维卷积 torch一维卷积_ide_05

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

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

resnet一维卷积 torch一维卷积_卷积_06


参考 : 链接更新:对于这里 out_channel 的理解

resnet一维卷积 torch一维卷积_resnet一维卷积_07


图片源于:链接

nn.Conv2D

这里一般处理图片数据

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

详情请看 链接