当前位置:   article > 正文

基于CNN神经网络的情感分析_embedding层、convolutional层

embedding层、convolutional层

TextCNN介绍

卷积神经网络(Convolutional Neural Network, CNN)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络最早主要用来处理图像信息,2014年,Kim1提出TextCNN,将卷积神经网络CNN应用到文本分类任务中。其详细结构示例如下图所示。
在这里插入图片描述

图片参考Kim等人论文《Convolutional Neural Networks for Sentence Classification》

1.嵌入层(embedding)

预训练词向量作为嵌入层,将数据中所有词分别表示成向量形式,得到一个词向量矩阵,该矩阵可以是静态的(static),用预训练词向量初始化embeddings,训练过程中不再更新,也可以是非静态(non-static),根据反向传播更新。

2.卷积层(Convolution)

设单词个数为n,词向量一共有d维,则得到n*d的矩阵。然后经过个数为k的不同卷积核大小(region_size)的一维卷积,设不同大小卷积核的个数(filters)为m,卷积核宽度与词向量维度一致为d,高度h是超参数。共得到k*m个特征图(feature map)。
例如图3-4所示,单词个数n=7,词向量维度d=5,得到7*5的矩阵,经过 k=3的region_size=(2,3,4),每个region_size 3个filters的卷积层卷积,得到3*2=6个feature map。

3.池化层(Polling)

不同尺寸的卷积核得到的特征大小不同,对每个feature map使用池化函数,使它们的维度相同,之后进行拼接,得到最终的k*m维列向量。
例如,上图中,对6个feature map使用1-max pooling得到6个维度相同的向量,之后将向量进行拼接,得到6维列向量。

4.全连接层(FullConnection and softmax)

将上一层得到的向量输入到全连接的softmax层,即可输出每个类别的概率。

TextCNN实验

本文使用non-static模式,采用预训练好的词向量,并在训练TextCNN时进行微调。由于CNN要求输入数据的长度一致,根据评论的最大长度,将长度小于50的评论补0,长度大于50的评论截断。
实验步骤:
1.不断调整模型中的超参数以提高模型性能,最终将模型的超参数设置为:max_seq_len:50,filter_sizes=[2,3,4],n-filters(每个filter数量)=100,batch-size:64,learning rate:0.0001,dropout rate:0.5。
2.损失函数采用交叉熵,使用Adam优化器进行最多200个epochs训练,当验证集损失连续20个epochs没有下降时,停止训练,将训练过程验证集损失最小的模型作为测试集输入的模型,得到最终测试集的准确率。
3.进行步骤2中的10次实验,得到最终的准确率±标准差为:0.8874±0.0042。

核心代码展示

import numpy as np
import pickle
import torch
import torch.nn as nn
import torch.utils.data
import time
import os
import torch.nn.functional as F
from sklearn import metrics
max_seq_length=50


with open("DATA/x_train.txt", "rb") as f:
    x_train = pickle.load(f)

with open("DATA/x_valid.txt", "rb") as f:
    x_valid = pickle.load(f)

with open("DATA/x_test.txt","rb") as f:
    x_test = pickle.load(f)
#将数据弄成长度相同
def split_data(corpus):
    for sentence in corpus:
       if len(sentence)>max_seq_length:
          for i in range(len(sentence)-max_seq_length):
              sentence.pop()
       else:
          sentence.extend([0]*(max_seq_length-len(sentence)))
    return corpus
embeddings=np.loadtxt("DATA/embeddings.txt",dtype=float)
embeddings=torch.from_numpy(embeddings)
x_train=split_data(x_train)
x_train=np.array(x_train)
x_train=torch.LongTensor(x_train)
y_train=np.loadtxt("DATA/y_train.txt",dtype=int)
y_train=torch.LongTensor(y_train)

x_valid=split_data(x_valid)
x_valid=np.array(x_valid)
x_valid=torch.LongTensor(x_valid)
y_valid=np
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/858862
推荐阅读
相关标签
  

闽ICP备14008679号