深度学习案例教程 课件6.6实践任务新闻主题分类_第1页
深度学习案例教程 课件6.6实践任务新闻主题分类_第2页
深度学习案例教程 课件6.6实践任务新闻主题分类_第3页
深度学习案例教程 课件6.6实践任务新闻主题分类_第4页
深度学习案例教程 课件6.6实践任务新闻主题分类_第5页
已阅读5页,还剩31页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六节

实践任务-新闻主题分类本章的实践任务是关于新闻主题的分类,以一段新闻报道中的文本描述内容为输入,使用模型帮助我们判断它最有可能属于哪一种类型的新闻,这是典型的文本分类问题,我们这里假定每种类型是互斥的,即文本描述有且只有一种类型。实践任务第六节

实践任务-新闻主题分类AG_NEWS数据集是一个包含了100多万篇文章的集合。学术社区为了数据挖掘、信息检索、数据压缩等方面的学术研究整理了这个数据集。AG_NEWS数据集有4个标签,即模型中的数据分类数量为4,这4个标签为:World、Sports、Business和Sci/Tec。Torchtext库提供了一些原始数据迭代器,这些迭代器可以查看原始的字符串数据。例如,AG_NEWS数据集迭代器可以生成包含文本和标签的元组。实践1数据处理importtorchfromtorchtext.datasetsimportAG_NEWStrain_iter=iter(AG_NEWS(split='train'))print(next(train_iter))代码实现实践任务1-数据处理【结果】(3,"WallSt.BearsClawBackIntotheBlack(Reuters)Reuters-Short-sellers,WallStreet'sdwindling\\bandofultra-cynics,areseeinggreen

again.")实践任务1-数据处理tokenizer=get_tokenizer('basic_english') train_iter=AG_NEWS(split='train') #分词生成器defyield_tokens(data_iter):for_,textindata_iter:yieldtokenizer(text)vocab=build_vocab_from_iterator(yield_tokens(train_iter),specials=["<unk>"])vocab.set_default_index(vocab["<unk>"])print(vocab(['here','is','an','example']))

#结果:[475,21,30,5297]代码实现实践任务1-数据处理tokenizer=get_tokenizer('basic_english') train_iter=AG_NEWS(split='train') #分词生成器defyield_tokens(data_iter):for_,textindata_iter:yieldtokenizer(text)vocab=build_vocab_from_iterator(yield_tokens(train_iter),specials=["<unk>"])vocab.set_default_index(vocab["<unk>"])print(vocab(['here','is','an','example']))

#结果:[475,21,30,5297]代码实现实践任务1-数据处理tokenizer=get_tokenizer('basic_english') train_iter=AG_NEWS(split='train') #分词生成器defyield_tokens(data_iter):for_,textindata_iter:yieldtokenizer(text)vocab=build_vocab_from_iterator(yield_tokens(train_iter),specials=["<unk>"])vocab.set_default_index(vocab["<unk>"])print(vocab(['here','is','an','example']))

#结果:[475,21,30,5297]代码实现实践任务1-数据处理tokenizer=get_tokenizer('basic_english') train_iter=AG_NEWS(split='train') #分词生成器defyield_tokens(data_iter):for_,textindata_iter:yieldtokenizer(text)vocab=build_vocab_from_iterator(yield_tokens(train_iter),specials=["<unk>"])vocab.set_default_index(vocab["<unk>"])print(vocab(['here','is','an','example']))

#结果:[475,21,30,5297]代码实现实践任务1-数据处理tokenizer=get_tokenizer('basic_english') train_iter=AG_NEWS(split='train') #分词生成器defyield_tokens(data_iter):for_,textindata_iter:yieldtokenizer(text)vocab=build_vocab_from_iterator(yield_tokens(train_iter),specials=["<unk>"])vocab.set_default_index(vocab["<unk>"])print(vocab(['here','is','an','example']))

#结果:[475,21,30,5297]代码实现实践任务1-数据处理tokenizer=get_tokenizer('basic_english') train_iter=AG_NEWS(split='train') #分词生成器defyield_tokens(data_iter):for_,textindata_iter:yieldtokenizer(text)vocab=build_vocab_from_iterator(yield_tokens(train_iter),specials=["<unk>"])vocab.set_default_index(vocab["<unk>"])print(vocab(['here','is','an','example']))

#结果:[475,21,30,5297]代码实现实践任务-新闻主题分类文本分类模型是由PyTorch库中的nn.EmbeddingBag层和一个用于分类的线性连接层组成。nn.EmbeddingBag在默认状态下计算所有词向量的平均值。虽然,文本文章由不同的长度,但是nn.EmbeddingBag模型不需要填充,因为文本的长度保存在偏移量中了。实践2模型搭建实践任务-新闻主题分类classTextClassificationModel(nn.Module):def__init__(self,vocab_size,embed_dim,num_class):super(TextClassificationModel,self).__init__()self.embedding=nn.EmbeddingBag(vocab_size,embed_dim,sparse=True)self.fc=nn.Linear(embed_dim,num_class)self.init_weights()definit_weights(self):initrange=0.5self.embedding.weight.data.uniform_(-initrange,initrange)self.fc.weight.data.uniform_(-initrange,initrange)self.fc.bias.data.zero_()代码实现实践任务-新闻主题分类classTextClassificationModel(nn.Module):def__init__(self,vocab_size,embed_dim,num_class):super(TextClassificationModel,self).__init__()self.embedding=nn.EmbeddingBag(vocab_size,embed_dim,sparse=True)self.fc=nn.Linear(embed_dim,num_class)self.init_weights()definit_weights(self):initrange=0.5self.embedding.weight.data.uniform_(-initrange,initrange)self.fc.weight.data.uniform_(-initrange,initrange)self.fc.bias.data.zero_()代码实现实践任务-新闻主题分类classTextClassificationModel(nn.Module):def__init__(self,vocab_size,embed_dim,num_class):super(TextClassificationModel,self).__init__()self.embedding=nn.EmbeddingBag(vocab_size,embed_dim,sparse=True)self.fc=nn.Linear(embed_dim,num_class)self.init_weights()definit_weights(self):initrange=0.5self.embedding.weight.data.uniform_(-initrange,initrange)self.fc.weight.data.uniform_(-initrange,initrange)self.fc.bias.data.zero_()代码实现实践任务-新闻主题分类defforward(self,text,offsets):embedded=self.embedding(text,offsets)returnself.fc(embedded)deftrain(dataloader):model.train()total_acc,total_count=0,0log_interval=500start_time=time.time()代码实现实践任务-新闻主题分类defforward(self,text,offsets):embedded=self.embedding(text,offsets)returnself.fc(embedded)deftrain(dataloader):model.train()total_acc,total_count=0,0log_interval=500start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类foridx,(label,text,offsets)inenumerate(dataloader):optimizer.zero_grad()predicted_label=model(text,offsets)loss=criterion(predicted_label,label)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(),0.1)optimizer.step()total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=

label.size(0)ifidx%log_interval==0andidx>0:elapsed=time.time()-start_timeprint('|epoch{:3d}|{:5d}/{:5d}batches''|accuracy{:8.3f}'.format(epoch,idx,len(dataloader),total_acc/total_count))total_acc,total_count=0,0start_time=time.time()代码实现实践任务-新闻主题分类defevaluate(dataloader):model.eval()total_acc,total_count=0,0withtorch.no_grad():foridx,(label,text,offsets)inenumerate(dataloader):predicted_label=model(text,offsets)loss=criterion(predicted_label,label)total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=label.size(0)returntotal_acc/total_count实践任务-新闻主题分类defevaluate(dataloader):model.eval()total_acc,total_count=0,0withtorch.no_grad():foridx,(label,text,offsets)inenumerate(dataloader):predicted_label=model(text,offsets)loss=criterion(predicted_label,label)total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=label.size(0)returntotal_acc/total_count实践任务-新闻主题分类defevaluate(dataloader):model.eval()total_acc,total_count=0,0withtorch.no_grad():foridx,(label,text,offsets)inenumerate(dataloader):predicted_label=model(text,offsets)loss=criterion(predicted_label,label)total_acc+=(predicted_label.argmax(1)==label).sum().item()total_count+=label.size(0)returntotal_acc/total_count实践任务-新闻主题分类因为原始的AG_NEWS没有测试数据集,我们将数据集拆分为训练集和测试集,其中训练集占比为95%,测试集占5%。这里使用PyTorch核心库中torch.utils.data.dataset.random_split来拆分数据。CrossEntropyLoss在一个类中结合了nn.LogSoftmax和nn.NLLLoss,当想训练一个有多个类别的分类模型的时候非常实用。SGD作为优化器实现了随机梯度下降。初始的学习率为5,使用StepLR在学习的过程中调整学习率。实践3模型训练实践任务-新闻主题分类#超参数EPOCHS=10LR=5BATCH_SIZE=64criterion=torch.nn.CrossEntropyLoss()optimizer=torch.optim.SGD(model.parameters(),lr=LR)scheduler=torch.optim.lr_scheduler.StepLR(optimizer,1.0,gamma=0.1)total_accu=Nonetrain_iter,test_iter=AG_NEWS()train_dataset=to_map_style_dataset(train_iter)test_dataset=to_map_style_dataset(test_iter)num_train=int(len(train_dataset)*0.95)split_train_,split_valid_=\random_split(train_dataset,[num_train,len(train_dataset)-num_train])代码实现实践任务-新闻主题分类#超参数EPOCHS=10LR=5BATCH_SIZE=64criterion=torch.nn.CrossEntropyLoss()optimizer=torch.optim.SGD(model.parameters(),lr=LR)scheduler=torch.optim.lr_scheduler.StepLR(optimizer,1.0,gamma=0.1)total_accu=Nonetrain_iter,test_iter=AG_NEWS()train_dataset=to_map_style_dataset(train_iter)test_dataset=to_map_style_dataset(test_iter)num_train=int(len(train_dataset)*0.95)split_train_,split_valid_=\random_split(train_dataset,[num_train,len(train_dataset)-num_train])代码实现实践任务-新闻主题分类#超参数EPOCHS=10LR=5BATCH_SIZE=64criterion=torch.nn.CrossEntropyLoss()optimizer=torch.optim.SGD(model.parameters(),lr=LR)scheduler=torch.optim.lr_scheduler.StepLR(optimizer,1.0,gamma=0.1)total_accu=Nonetrain_iter,test_iter=AG_NEWS()train_dataset=to_map_style_dataset(train_iter)test_dataset=to_map_style_dataset(test_iter)num_train=int(len(train_dataset)*0.95)split_train_,split_valid_=\random_split(train_dataset,[num_train,len(train_dataset)-num_train])代码实现实践任务-新闻主题分类#超参数EPOCHS=10LR=5BATCH_SIZE=64criterion=torch.nn.CrossEntropyLoss()optimizer=torch.optim.SGD(model.parameters(),lr=LR)scheduler=torch.optim.lr_scheduler.StepLR(optimizer,1.0,gamma=0.1)total_accu=Nonetrain_iter,test_iter=AG_NEWS()train_dataset=to_map_style_dataset(train_iter)test_dataset=to_map_style_dataset(test_iter)num_train=int(len(train_dataset)*0.95)split_train_,split_valid_=\random_split(train_dataset,[num_train,len(train_dataset)-num_train])代码实现实践任务-新闻主题分类train_dataloader=DataLoader(split_train_,batch_size=BATCH_SIZE,shuffle=True,collate_fn=collate_batch)valid_dataloader=DataLoader(split_valid_,batch_size=BATCH_SIZE,shuffle=True,collate_fn=collate_batch)test_dataloader=DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=True,collate_fn=collate_batch)forepochinrange(1,EPOCHS+1):epoch_start_time=time.time()train(train_dataloader)accu_val=evaluate(valid_dataloader)iftotal_accuisnotNoneandtotal_accu>accu_val:scheduler.step()else:total_accu=accu_val代码实现实践任务-新闻主题分类train_dataloader=DataLoader(split_train_,batch_size=BATCH_SIZE,shuffle=True,collate_fn=collate_batch)valid_dataloader=DataLoader(split_valid_,batch_size=BATCH_SIZE,shuffle=True,collate_fn=collate_batch)test_dataloader=DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=True,collate_fn=collate_batch)forepochinrange(1,EPOCHS+1):epoch_start_time=time.time()train(train_dataloader)accu_val=evaluate(valid_dataloader)iftotal_accuisnotNoneandtotal_accu>accu_val:scheduler.step()else:total_accu=accu_val代码实现实践任务-新闻主题分类在前面已经定义了评估模型准确率的函数evaluate,下面使用模型来测试一则新闻,代码如下:ag_news_label={1:"World",2:"Sports",3:"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论