class torch.nn.Conv1d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True)
Conv1d()函数就是利用指定大小的一维卷积核对输入的多通道一维输入信号进行一维卷积操作的卷积层。
最简单的情况下,对于输入大小为 ( N , C i n , L i n ) (N, C_{in}, L_{in}) (N,Cin,Lin),输出大小为 ( N , C o u t , L o u t ) (N, C_{out}, L_{out}) (N,Cout,Lout)的一维卷积层,其中, N 代表batch size,C代表通道的数量, L代表信号序列的长度。
一般来说,一维卷积nn.Conv1d()用于文本数据,只对宽度进行卷积,对高度不卷积。通常,输入大小为word_embedding_dim * max_sent_length,其中,word_embedding_dim为词向量的维度,max_sent_length为句子的最大长度。卷积核窗口在句子长度的方向上滑动,进行卷积操作。 |
示例:
输入:批大小为50,句子的最大长度为35,词向量维度为300
目标:句子分类,共2类
import torch
import torch.nn as nn
# max_sent_len=35, batch_size=50, embedding_size=300
conv1 = nn.Conv1d(in_channels=300, out_channels=100, kernel_size=3)
input = torch.randn(50, 35, 300)
# batch_size x max_sent_len x embedding_size -> batch_size x embedding_size x max_sent_len
input = input.permute(0, 2, 1)
print("input:", input.size())
output = conv1(input)
print("output:", output.size())
# 最大池化
pool1d = nn.MaxPool1d(kernel_size=35-3+1)
pool1d_value = pool1d(output)
print("最大池化输出:", pool1d_value.size())
# 全连接
fc = nn.Linear(in_features=100, out_features=2)
fc_inp = pool1d_value.view(-1, pool1d_value.size(1))
print("全连接输入:", fc_inp.size())
fc_outp = fc(fc_inp)
print("全连接输出:", fc_outp.size())
# softmax
m = nn.Softmax()
out = m(fc_outp)
print("输出结果值:", out)
class torch.nn.Conv2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True)
该函数是利用指定大小的二维卷积核对输入的多通道二维输入信号进行二维卷积操作的卷积层。
在最简单的情况下,对于输入大小为 ( N , C i n , H , W ) (N, C_{in}, H, W) (N,Cin,H,W),输出大小为 ( N , C o u t , H o u t , W o u t ) (N, C_{out}, H_{out}, W_{out}) (N,Cout,Hout,Wout)的二维维卷积层,其卷积计算过程可以如下表述:
N N N is a batch size, 代表通道的数量, H H H是输入的二维数据的像素高度, W W W是输入的二维数据的像素宽度。
如果要用二维卷积来实现文本的处理也是可以的,还是上面的那个任务,用二维卷积来做的话,代码如下所示:
import torch
import torch.nn as nn
import torch.nn.functional as F
# max_sent_len=35, batch_size=50, embedding_dim=300
conv2 = nn.Conv2d(in_channels=1, out_channels=100, kernel_size=(3, 300))
# batch_size x 1 × max_sent_len x embedding_dim
input = torch.randn(50, 1, 35, 300)
print("input:", input.size())
output = conv2(input)
# batch_size × kernel_num × H × 1,其中H=max_sent_len-kernel_size+1
print("output:", output.size())
# 最大池化
# pool = nn.MaxPool1d(kernel_size=35-3+1)
output = output.squeeze(3)
pool1d_value = F.max_pool1d(output, output.size(2))
print("最大池化输出:", pool1d_value.size())
# 全连接
fc = nn.Linear(in_features=100, out_features=2)
fc_inp = pool1d_value.view(-1, pool1d_value.size(1))
print("全连接输入:", fc_inp.size())
fc_outp = fc(fc_inp)
print("全连接输出:", fc_outp.size())
# softmax
out = F.softmax(fc_outp, dim=1)
print("输出结果值:", out)
class torch.nn.MaxPool1d(
kernel_size,
stride=None,
padding=0,
dilation=1,
return_indices=False,
ceil_mode=False)
该函数对输入的多通道信号执行一维最大池化操作。
最简单的情况下,对于输入大小为 ( N , C , L i n ) (N, C, L_{in}) (N,C,Lin) ,输出大小为 ( N , C , L o u t ) (N, C, L_{out}) (N,C,Lout) 的池化操作,此池化过程可表述如下:
参数说明:
class torch.nn.MaxPool2d(
kernel_size,
stride=None,
padding=0,
dilation=1,
return_indices=False,
ceil_mode=False)
该函数是对输入的多通道信号执行二维最大池化操作。
最简单的情况下,对于输入大小为 ( N , C , H , W ) (N, C, H, W) (N,C,H,W) ,输出大小为 ( N , C , H o u t , W o u t ) (N, C, H_{out}, W_{out}) (N,C,Hout,Wout),kernel_size为 ( k H , k W ) (kH, kW) (kH,kW)的池化操作.
示例:
import torch
import torch.nn as nn
# pool of square window of size=3, stride=2
# m = nn.MaxPool2d(3, stride=2)
# pool of non-square window
m = nn.MaxPool2d((5, 2))
input = torch.randn(3, 5, 10)
print(input.size())
output = m(input)
print(output.size())