NLP领域的CNN如何操作?

NLP领域的一种CNN操作是:对于输入的句子x做卷积,代码举例如下:

x = [conv(x.permute(0,2,1)) for conv in self.convs]     # 1
x = [F.max_pool1d(i, i.size(2)).squeeze(2) for i in x]  # 2
x = torch.cat(x,1)                                      # 3

其中使用不同的卷积核Ks = kernel_sizes=[3, 4, 5],Ci = embed_dim=100,Co = kernel_num=100

 

        self.convs = nn.ModuleList([ nn.Sequential(
                                            nn.Conv1d(Ci,Co,K),
                                            nn.BatchNorm1d(Co),
                                            nn.LeakyReLU(inplace=True),

                                            nn.Conv1d(Co,Co,K),
                                            nn.BatchNorm1d(Co),
                                            nn.LeakyReLU(inplace=True))
                                    for K in Ks ])

以下是代码讲解:

# 1

输入x为[N, len, dim]:其中N为句子个数,len为一个batch内的所有句子的最长长度,dim为input_dim;permute将x维度变换为[N, dim, len],因为一维卷积是在最后一个维度进行操作;然后分别对于x分别做不同卷积核下的nn.Sequential([N, dim, len]->conv1d->[N, Co, (len-K+1)]->batchnorm1d->[N, Co, (len-K+1)]->leakyrelu->[N, Co, (len-K+1)])如此进行两遍;最后第一行x得到[x1,x2,x3]。

#关于conv1d的讲解:可以参考pytorch官网https://pytorch.org/docs/stable/nn.html?highlight=conv1d#torch.nn.Conv1d或博客:https://blog.csdn.net/sunny_xsc1994/article/details/82969867。其中需要理解的是:对于代码nn.Conv1d(Ci,Co,K)中Ci为输入通道即dim,Co为输出通道即产生Co个当前卷积核,K为卷积核的大小即3/4/5,对len进行卷积,输入[N, dim, len]则输出为[N, Co, (len-K+1)]。

#关于BatchNorm1d的讲解:可以参考pytorch官网https://pytorch.org/docs/stable/nn.html?highlight=batchnorm1d#torch.nn.BatchNorm1d博客http://wemedia.ifeng.com/66889710/wemedia.shtml博客https://blog.csdn.net/qq_25737169/article/details/79048516。(批标准化/归一化,BatchNorm可以加速训练并获得更加稳定的结果)。其中需要理解:对于nn.BatchNorm1d(Co)中Co为上一步骤得到的x的第一维度,批处理归一化则在此维度上进行,输入[N, Co, (len-K+1)](或[N, Co])输出和输入维度相同。

#关于LeakyReLU的讲解:参考pytorch官网https://pytorch.org/docs/stable/nn.html?highlight=leakyrelu#torch.nn.LeakyReLU博客https://www.jianshu.com/p/8385aa74e2de其中需要理解:nn.LeakyReLU的输入要求[N,*],输出和输入维度相同。其中inplace=True指计算结果在原变量上覆盖,节省内(显)存,省去反复申请和释放内存的时间。

# 2 

然后将[x1,x2,x3]中的xi[N, Co, (len-2K+2)]分别在maxpooling为[N, Co, 1]并squeeze为维度[N, Co],依旧用列表存放,第二行x为[x1,x2,x3],每个xi维度为[N,Co]。

# 3 

第三行x得到[N,3*Co],这样就把三个卷积核分别做卷积归一激活函数后的结果拼到了一起,即为N个句子卷积后的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值