在第 7 节中,我们研究了使用二维 CNN 处理二维图像数据的机制,这些机制应用于相邻像素等局部特征。尽管最初是为计算机视觉设计的,但 CNN 也广泛用于自然语言处理。简单地说,只需将任何文本序列视为一维图像即可。通过这种方式,一维 CNN 可以处理局部特征,例如n- 文本中的克。
在本节中,我们将使用textCNN模型来演示如何设计用于表示单个文本的 CNN 架构 ( Kim, 2014 )。与图 16.2.1使用带有 GloVe 预训练的 RNN 架构进行情感分析相比,图 16.3.1的唯一区别在于架构的选择。
16.3.1。一维卷积
在介绍模型之前,让我们看看一维卷积是如何工作的。请记住,这只是基于互相关运算的二维卷积的特例。
如图 16.3.2所示,在一维情况下,卷积窗口在输入张量上从左向右滑动。在滑动过程中,输入子张量(例如,0和1在 图 16.3.2中)包含在某个位置的卷积窗口和内核张量(例如,1和2在 图 16.3.2中)按元素相乘。这些乘法的总和给出单个标量值(例如, 0×1+1×2=2在图 16.3.2中)在输出张量的相应位置。
我们在以下函数中实现一维互相关 corr1d
。给定一个输入张量X
和一个内核张量 K
,它返回输出张量Y
。
我们可以从 图 16.3.2构造输入张量X
和核张量来验证上述一维互相关实现的输出。K
tensor([ 2., 5., 8., 11., 14., 17.])
对于任何具有多个通道的一维输入,卷积核需要具有相同数量的输入通道。然后对于每个通道,对输入的一维张量和卷积核的一维张量进行互相关运算,将所有通道的结果相加得到一维输出张量。图 16.3.3显示了具有 3 个输入通道的一维互相关运算。
我们可以对多个输入通道进行一维互相关运算,并验证 图 16.3.3中的结果。
def corr1d_multi_in(X, K):
# First, iterate through the 0th dimension (channel dimension) of `X` and
# `K`. Then, add them together
return sum(corr1d(x, k) for x, k in zip(X, K))
X = torch.tensor([[0, 1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6, 7],
[2, 3, 4, 5, 6, 7, 8]])
K = torch.tensor([[1, 2], [3, 4], [-1, -3]])
corr1d_multi_in(X, K)
tensor([ 2., 8., 14., 20., 26., 32.])
def corr1d_multi_in(X, K):
# First, iterate through the 0th dimension (channel dimension) of `X` and
# `K`. Then, add them together
return sum(corr1d(x, k) for x, k in zip(X, K))
X = np.array([[0, 1, 2, 3, 4, 5, 6],
[1, 2, 3, 4, 5, 6, 7],
[2, 3, 4, 5, 6, 7, 8]])
K = np.array([[1, 2], [3, 4], [-1, -3]])
corr1d_multi_in(X, K)
array([ 2., 8., 14., 20., 26., 32.])
请注意,多输入通道一维互相关等同于单输入通道二维互相关。为了说明,图 16.3.3中的多输入通道一维互相关的等效形式是图 16.3.4中的单输入通道二维互相关 ,其中卷积核必须与输入张量相同。