pytorch-NLP中的卷积和最大池化

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的信息
我爱 embedding [1,0...,0] one_hot embedding [0,0.,1,..,0] one_hot embedding 爱你 embedding [0,0...,1] one_hot embedding
  • 一维最大池化,即输入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

猜你喜欢

转载自blog.csdn.net/tailonh/article/details/112128197