赞
踩
卷积神经网络(Convolutional Neural Network, CNN)是一种具有局部连接、权重共享等特性的深层前馈神经网络。卷积神经网络最早主要用来处理图像信息,2014年,Kim1提出TextCNN,将卷积神经网络CNN应用到文本分类任务中。其详细结构示例如下图所示。
图片参考Kim等人论文《Convolutional Neural Networks for Sentence Classification》
预训练词向量作为嵌入层,将数据中所有词分别表示成向量形式,得到一个词向量矩阵,该矩阵可以是静态的(static),用预训练词向量初始化embeddings,训练过程中不再更新,也可以是非静态(non-static),根据反向传播更新。
设单词个数为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。
不同尺寸的卷积核得到的特征大小不同,对每个feature map使用池化函数,使它们的维度相同,之后进行拼接,得到最终的k*m维列向量。
例如,上图中,对6个feature map使用1-max pooling得到6个维度相同的向量,之后将向量进行拼接,得到6维列向量。
将上一层得到的向量输入到全连接的softmax层,即可输出每个类别的概率。
本文使用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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。