textCNN论文与原理——漫笔天职类(基于pytorch)
前言前文已经先容了TextCNN的基本原理,如果还不熟悉的建议看看原理:【深度学习】textCNN论文与原理[1]及一个简朴的基于pytorch的图像分类案例:【深度学习】卷积神经网络-图片分类案例(pytorch实现)[2]。现在先容一下如何使用textcnn举行文天职类,该部门内容参考了:Pytorch-textCNN(不挪用torchtext与挪用torchtext)[3]。固然原文写的也挺好的,不外感受不够工程化。
现在我们就来看看如何使用pytorch和cnn来举行文天职类吧。1 实验语料先容与预处置惩罚本文举行的任务本质是一个情感二分类的任务,语料内容为英文,其花样如下:一行文本即实际的一个样本,样本数据划分在neg.txt和pos.txt文件中。
在举行数据预处置惩罚之前,先先容一下本任务可能用到的一些参数,这些参数我放在了一个config.py的文件中,内容如下:#!/usr/bin/python#-*-coding:UTF-8-*-"""@author:juzipi@file:config.py@time:2020/12/06@description:设置文件"""LARGE_SENTENCE_SIZE=50#句子最大长度BATCH_SIZE=128#语料批次巨细LEARNING_RATE=1e-3#学习率巨细EMBEDDING_SIZE=200#词向量维度KERNEL_LIST=[3,4,5]#卷积核长度FILTER_NUM=100#每种卷积核输出通道数DROPOUT=0.5#dropout概率EPOCH=20#训练轮次下面就是数据预处置惩罚历程啦,先把代码堆上来:importnumpyasnpfromcollectionsimportCounterimportrandomimporttorchfromsklearn.model_selectionimporttrain_test_splitimportconfigrandom.seed(1000)np.random.seed(1000)torch.manual_seed(1000)defread_data(filename):"""数据读取:paramfilename:文件路径:return:数据读取内容(整个文档的字符串)"""withopen(filename,"r",encoding="utf8")asreader:content=reader.read()returncontentdefget_attrs():"""获取语料相关参数:return:vob_size,pos_text,neg_text,total_text,index2word,word2index"""pos_text,neg_text=read_data("corpus/pos.txt"),read_data("corpus/neg.txt")total_text=pos_text+'n'+neg_texttext=total_text.split()vocab=[wforw,finCounter(text).most_common()iff>1]vocab=['<pad>','<unk>']+vocabindex2word={i:wordfori,wordinenumerate(vocab)}word2index={word:ifori,wordinenumerate(vocab)}returnlen(word2index),pos_text,neg_text,total_text,index2word,word2indexdefconvert_text2index(sentence,word2index,max_length=config.LARGE_SENTENCE_SIZE):"""将语料转成数字化数据:paramsentence:单条文本:paramword2index:词语-索引的字典:parammax_length:text_cnn需要的文本最大长度:return:对语句举行截断和填充的数字化后的效果"""unk_id=word2index['<unk>']pad_id=word2index['<pad>']#对句子举行数字化转换,对于未在词典中泛起过的词用unk的index填充indexes=[word2index.get(word,unk_id)forwordinsentence.split()]iflen(indexes)<max_length:indexes.extend([pad_id]*(max_length-len(indexes)))else:indexes=indexes[:max_length]returnindexesdefnumber_sentence(pos_text,neg_text,word2index):"""语句数字化处置惩罚:parampos_text:正例全部文本:paramneg_text:负例全部文本:paramword2index:词到数字的字典:return:经由训练集和测试集划分的效果X_train,X_test,y_train,y_test"""pos_indexes=[convert_text2index(sentence,word2index)forsentenceinpos_text.split('n')]neg_indexes=[convert_text2index(sentence,word2index)forsentenceinneg_text.split('n')]#为了利便处置惩罚,转化为numpy花样pos_indexes=np.array(pos_indexes)neg_indexes=np.array(neg_indexes)total_indexes=np.concatenate((pos_indexes,neg_indexes),axis=0)pos_targets=np.ones((pos_indexes.shape[0]))#正例设置为1neg_targets=np.zeros((neg_indexes.shape[0]))#负例设置为0total_targets=np.concatenate((pos_targets,neg_targets),axis=0).reshape(-1,1)returntrain_test_split(total_indexes,total_targets,test_size=0.2)defget_batch(x,y,batch_size=config.BATCH_SIZE,shuffle=True):"""构建迭代器,获取批次数据:paramx:需要划分全部特征数据的数据集:paramy:需要划分全部标签数据的数据集:parambatch_size:批次巨细:paramshuffle:是否打乱:return:以迭代器的方式返回数据"""assertx.shape[0]==y.shape[0],"errorshape!"ifshuffle:#该函数是对[0,x.shape[0])举行随机排序shuffled_index=np.random.permutation(range(x.shape[0]))#使用随机排序后的索引获取新的数据集效果x=x[shuffled_index]y=y[shuffled_index]n_batches=int(x.shape[0]/batch_size)#统计共几个完整的batchforiinrange(n_batches-1):x_batch=x[i*batch_size:(i+1)*batch_size]y_batch=y[i*batch_size:(i+1)*batch_size]yieldx_batch,y_batch其中各个函数怎么使用以及相关参数已经在函数的说明中了,这里再赘述就延长观众姥爷的时间了,哈哈。这些代码我放在了一个dataloader.py的python文件中了,相信你汇合理的使用它,如果有啥不明确的可以留言交流哦。
2 textcnn模型构建我依然先把代码堆出来,不是网传那么一句话嘛:“talk is cheap, show me code”,客官,代码来咯:#!/usr/bin/python#-*-coding:UTF-8-*-"""@author:juzipi@file:model.py@time:2020/12/06@description:"""importnumpyasnpimporttorchfromtorchimportnn,optimimportmatplotlib.pyplotaspltimportconfigimportdataloaderimportutilsclassTextCNN(nn.Module):#output_size为输出种别(2个种别,0和1),三种kernel,size划分是3,4,5,每种kernel有100个def__init__(self,vocab_size,embedding_dim,output_size,filter_num=100,kernel_list=(3,4,5),dropout=0.5):super(TextCNN,self).__init__()self.embedding=nn.Embedding(vocab_size,embedding_dim)#1表现channel_num,filter_num即输出数据通道数,卷积核巨细为(kernel,embedding_dim)self.convs=nn.ModuleList([nn.Sequential(nn.Conv2d(1,filter_num,(kernel,embedding_dim)),nn.LeakyReLU(),nn.MaxPool2d((config.LARGE_SENTENCE_SIZE-kernel+1,1)))forkernelinkernel_list])self.fc=nn.Linear(filter_num*len(kernel_list),output_size)self.dropout=nn.Dropout(dropout)defforward(self,x):x=self.embedding(x)#[128,50,200](batch,seq_len,embedding_dim)x=x.unsqueeze(1)#[128,1,50,200]即(batch,channel_num,seq_len,embedding_dim)out=[conv(x)forconvinself.convs]out=torch.cat(out,dim=1)#[128,300,1,1],各通道的数据拼接在一起out=out.view(x.size(0),-1)#展平out=self.dropout(out)#构建dropout层logits=self.fc(out)#效果输出[128,2]returnlogits#数据获取VOB_SIZE,pos_text,neg_text,total_text,index2word,word2index=dataloader.get_attrs()#数据处置惩罚X_train,X_test,y_train,y_test=dataloader.number_sentence(pos_text,neg_text,word2index)#模型构建cnn=TextCNN(VOB_SIZE,config.EMBEDDING_SIZE,2)#print(cnn)#优化器选择optimizer=optim.Adam(cnn.parameters(),lr=config.LEARNING_RATE)#损失函数选择criterion=nn.CrossEntropyLoss()deftrain(model,opt,loss_function):"""训练函数:parammodel:模型:paramopt:优化器:paramloss_function:使用的损失函数:return:该轮训练模型的损失值"""avg_acc=[]model.train()#模型处于训练模式#批次训练forx_batch,y_batchindataloader.get_batch(X_train,y_train):x_batch=torch.LongTensor(x_batch)#需要是Long类型y_batch=torch.tensor(y_batch).long()y_batch=y_batch.squeeze()#数据压缩到1维pred=model(x_batch)#模型预测#获取批次预测效果最大值,max返回最大值和最大索引(已经默认索引为0的为负类,1为为正类)acc=utils.binary_acc(torch.max(pred,dim=1)[1],y_batch)avg_acc.append(acc)#记载该批次正确率#使用损失函数盘算损失值,预测值要放在前loss=loss_function(pred,y_batch)#清楚之前的梯度值opt.zero_grad()#反向流传loss.backward()#参数更新opt.step()#所有批次数据的正确率盘算avg_acc=np.array(avg_acc).mean()returnavg_accdefevaluate(model):"""模型评估:parammodel:使用的模型:return:返回当前训练的模型在测试集上的效果"""avg_acc=[]model.eval()#打开模型评估状态withtorch.no_grad():forx_batch,y_batchindataloader.get_batch(X_test,y_test):x_batch=torch.LongTensor(x_batch)y_batch=torch.tensor(y_batch).long().squeeze()pred=model(x_batch)acc=utils.binary_acc(torch.max(pred,dim=1)[1],y_batch)avg_acc.append(acc)avg_acc=np.array(avg_acc).mean()returnavg_acc#记载模型训练历程中模型在训练集和测试集上模型预测正确率体现cnn_train_acc,cnn_test_acc=[],[]#模型迭代训练forepochinrange(config.EPOCH):#模型训练train_acc=train(cnn,optimizer,criterion)print('epoch={},训练准确率={}'.format(epoch,train_acc))#模型测试test_acc=evaluate(cnn)print("epoch={},测试准确率={}".format(epoch,test_acc))cnn_train_acc.append(train_acc)cnn_test_acc.append(test_acc)#模型训练历程效果展示plt.plot(cnn_train_acc)plt.plot(cnn_test_acc)plt.ylim(ymin=0.5,ymax=1.01)plt.title("TheaccuracyoftextCNNmodel")plt.legend(["train",'test'])plt.show()多说无益法式都在这,相关原理已经先容了,列位读者逐步品尝,有事call me。对了,法式最后运行的效果如下:模型分类效果3 效果的一个简要分析其中随着模型的训练,模型倒是在训练集上效果倒好(究竟模型在训练集上调整参数嘛),测试集上的效果也逐步上升最后还略有下降,可见开始过拟合咯。本任务没有使用一些预训练的词向量以及语料先容,总体也就1万多条,在测试集到达了这个效果也是差强人意了。主要想说明如何使用pytorch构建textcnn模型,实际中的任务可能更庞大,对语料的处置惩罚也更贫苦(数据决议模型的上限嘛)。
或许看完这个文章后,你对损失函数、优化器、数据批次处置惩罚等另有一些未解之谜和革新的期待,我努力在事情之余书写相关文章以飨读者,敬请关注哦。打条广告,想实时看到最新小我私家原创文章记得关注“AIAS编程有道”民众号哦,我在那里等你。
至于本文的全部代码和语料,我都上传到github上了:https://github.com/Htring/NLP_Applications[4],后续其他相关应用代码也会陆续更新,也接待star,指点哦。参考资料[1]【深度学习】textCNN论文与原理: https://piqiandong.blog.csdn.net/article/details/110099713[2]【深度学习】卷积神经网络-图片分类案例(pytorch实现): https://piqiandong.blog.csdn.net/article/details/109967487[3] Pytorch-textCNN(不挪用torchtext与挪用torchtext): https://www.cnblogs.com/cxq1126/p/13466998.html[4] https://github.com/Htring/NLP_Applications: https://github.com/Htring/NLP_Applications。
本文关键词:textCNN,论文,与,原理,—,漫笔,天职,类,基于,开云网址
本文来源:开云网址-www.wlxyss.com
同类文章排行
- 物流企业争相探索数字化智能化_开云网址
- 半月两度提高成品油消费税 专家呼吁调税立法【开云网址】
- 新闻早陈诉
- 生鲜配送物流成本高、用户黏度差‘开云网址’
- 代表建议立法建立饮用水水源保护生态补偿机制
- 策马全案CEMACASE:平面设计中的194种创意拓展思路
- 开云网址_环渤海动力煤价格指数周评(5月17-23日)
- C媒体城quot;荣膺quot;2011年英国最丑新建筑奖
- 从顺丰、圆通、中通、申通、韵达上市敲钟人,你能读出什么?
- 物流业提速需走出多重困境-开云网址
最新资讯文章
- textCNN论文与原理——漫笔天职类(基于pytorch)
- 洞庭湖:曾经的中国第一大湖,如今怎么样了?
- 超百万选手报名角逐有道词典英语争霸赛
- 浦东将打造亚太艺术品交易中心
- 【品牌】後仓品牌视觉设计
- “开云网址”中通快递发布2019年第三季度业绩
- 【开云网址】苏宁天天加速快递骨干网升级今年20+个新分拨中心
- 「开源」一个适合初学者学习的VUE后台项目,注释详尽,手把手
- 全国名师为你预测明天高考英语作文题 | 独家首发
- 酒企新媒体营销受阻 五大优化 “用新”让营销事半功倍
- 律云在线2.0 :对繁琐的法律服务说不!
- 千帆渡观点:留学市场改革的新时代已到来
- 美国学习难度大?来看看真正难度大的几大专业
- CDR教程第一课工具认识界面
- 西方造园变迁史
- 【空间】办公楼里的原生态巨型螺旋楼梯
- 京东到家回应“裁员”:尊重员工选择薪酬不变|开云网址
- 开云网址-2016年邮政行业发展统计公报
- 京东3C落地加速打通O2O内循环|开云网址
- 开云网址|货运与快递企业差异不单单在速度