×

PyTorch教程16.3之情感分析:使用卷积神经网络

消耗积分:0 | 格式:pdf | 大小:0.44 MB | 2023-06-05

李建设

分享资料个

第 7 节中,我们研究了使用二维 CNN 处理二维图像数据的机制,这些机制应用于相邻像素等局部特征。尽管最初是为计算机视觉设计的,但 CNN 也广泛用于自然语言处理。简单地说,只需将任何文本序列视为一维图像即可。通过这种方式,一维 CNN 可以处理局部特征,例如n- 文本中的克。

在本节中,我们将使用textCNN模型来演示如何设计用于表示单个文本的 CNN 架构 ( Kim, 2014 )图 16.2.1使用带有 GloVe 预训练的 RNN 架构进行情感分析相比,图 16.3.1的唯一区别在于架构的选择。

https://file.elecfans.com/web2/M00/A9/CD/poYBAGR9PKeAQJkEAAKGTT5l5tQ032.svg

图 16.3.1本节将预训练的 GloVe 提供给基于 CNN 的架构以进行情感分析。

import torch
from torch import nn
from d2l import torch as d2l

batch_size = 64
train_iter, test_iter, vocab = d2l.load_data_imdb(batch_size)
from mxnet import gluon, init, np, npx
from mxnet.gluon import nn
from d2l import mxnet as d2l

npx.set_np()

batch_size = 64
train_iter, test_iter, vocab = d2l.load_data_imdb(batch_size)

16.3.1。一维卷积

在介绍模型之前,让我们看看一维卷积是如何工作的。请记住,这只是基于互相关运算的二维卷积的特例。

https://file.elecfans.com/web2/M00/A9/CD/poYBAGR9PKmAM7I9AACdHttTIPM876.svg

图 16.3.2一维互相关运算。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素: 0×1+1×2=2.

如图 16.3.2所示,在一维情况下,卷积窗口在输入张量上从左向右滑动。在滑动过程中,输入子张量(例如,01图 16.3.2中)包含在某个位置的卷积窗口和内核张量(例如,12图 16.3.2中)按元素相乘。这些乘法的总和给出单个标量值(例如, 0×1+1×2=2图 16.3.2中)在输出张量的相应位置。

我们在以下函数中实现一维互相关 corr1d给定一个输入张量X和一个内核张量 K,它返回输出张量Y

def corr1d(X, K):
  w = K.shape[0]
  Y = torch.zeros((X.shape[0] - w + 1))
  for i in range(Y.shape[0]):
    Y[i] = (X[i: i + w] * K).sum()
  return Y
def corr1d(X, K):
  w = K.shape[0]
  Y = np.zeros((X.shape[0] - w + 1))
  for i in range(Y.shape[0]):
    Y[i] = (X[i: i + w] * K).sum()
  return Y

我们可以从 图 16.3.2构造输入张量X和核张量来验证上述一维互相关实现的输出。K

X, K = torch.tensor([0, 1, 2, 3, 4, 5, 6]), torch.tensor([1, 2])
corr1d(X, K)
tensor([ 2., 5., 8., 11., 14., 17.])
X, K = np.array([0, 1, 2, 3, 4, 5, 6]), np.array([1, 2])
corr1d(X, K)
array([ 2., 5., 8., 11., 14., 17.])

对于任何具有多个通道的一维输入,卷积核需要具有相同数量的输入通道。然后对于每个通道,对输入的一维张量和卷积核的一维张量进行互相关运算,将所有通道的结果相加得到一维输出张量。图 16.3.3显示了具有 3 个输入通道的一维互相关运算。

https://file.elecfans.com/web2/M00/AA/48/pYYBAGR9PK6ADR-WAAEf3eRCIIg775.svg

图 16.3.3具有 3 个输入通道的一维互相关操作。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素: 0×1+1×2+1×3+2×4+2×(−1)+3×(−3)=2.

我们可以对多个输入通道进行一维互相关运算,并验证 图 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中的单输入通道二维互相关 ,其中卷积核必须与输入张量相同。

https://file.elecfans.com/web2/M00/AA/48/pYYBAGR9PLKASTSGAAEeO2Qhstk969.svg

图 16.3.4单输入通道的二维互相关运算。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素:


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !