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')
一般我们需要关注的是以下几个参数:
- int_channels:
输入通道,在文本数据中,即词向量的维数 word_embedding_size - out_channels:
输出通道,可以认为是特征的维数,做一遍卷积(对应一个卷积核)可以得到一个特征,所以输出通道数决定了做卷积的遍数
(这里对于遍的理解看完下面的示例图就明白了) - 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
- stride:
kernel 移动的步长,参照上图 - 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 (或者是定义的元组的大小)
详情请看 链接