import torch
import torch.nn as nn
# 卷积
torch.manual_seed(6)
x = torch.randn(4,3,5) # [batch_size, seq_len, hidden]
x = x.unsqueeze(1) # [batch_size, channel=1, seq_len, hidden]
conv = nn.Conv2d(1,3,(2,5)) # [in_channels=1, out_channels=3, 卷积核的尺寸kernel_size=[2,5],2相当于考虑了bigram的信息, hidden=5]
res = conv(x) # [4, 3, 2, 1] batch_size=4, out_channels=3, 考虑了seq_len=3的bigram信息,通过二合一的方式,将seq_len变为了2, 将hidden=5卷成了hidden=1
# 最大池化
res = res.squeeze(3)
# print(res) # [4, 3, 2]
res = F.max_pool1d(res, res.size(2)).squeeze(2) #[4,3]
# print(res)
文本与图像处理的比较
针对一句话的文本,向量化后的表现形式为:
[batch_size, channel=1, seq_len, hidden]
seq_len :一句话的长度
hidden :词向量的维度
图像的表现形式为:
[ batch_size, channels, height, width ]
batch_size :一个批次中的样本数量
channels :通道数,也就是当前层的深度 1
height : 图片的高 7
width : 图片的宽 3
注:图像的输出通道数相当于卷积核的数量
- 在卷积时,考虑bigram的情况如下图所示,通过这种方式,融合bigram的信息
- 一维最大池化,即输入x的维度除了batch_size和channels,只有一个维度,即x是一个三维矩阵[batch_size, channels, hidden_state]
# 池化前-[4,3,2]
tensor([[[-0.0675, -0.5686],
[ 1.1370, 1.0989],
[ 0.2096, 1.1376]],
[[ 0.6315, 1.4087],
[-0.2241, 0.1478],
[-0.2324, 0.1870]],
[[-1.4967, -0.3137],
[ 0.8790, 0.5648],
[ 0.4510, 0.7341]],
[[ 0.0598, 1.3523],
[-0.4570, -0.2285],
[-0.2848, 0.7552]]])
# 池化并压缩后-[4,3]
# 一维最大池化,此时选择的是原行向量中最大的一个数值,如[-0.0675, -0.5686]中的-0.0675,[-0.2848, 0.7552]中的0.7552
tensor([[-0.0675, 1.1370, 1.1376],
[ 1.4087, 0.1478, 0.1870],
[-0.3137, 0.8790, 0.7341],
[ 1.3523, -0.2285, 0.7552]] )
参考链接
https://blog.csdn.net/sinat_34604992/article/details/103078205
https://blog.csdn.net/m0_37586991/article/details/87855342