当前位置:   article > 正文

torchtext安装报错终极解决方案 and N4:调用与搭建word2vec网络进行训练_为什么我安装了torchtext却无法使用

为什么我安装了torchtext却无法使用

torchtext安装终极方案

 方法1:直接新建环境按照指定版本安装。其中较新版如下,建议安装环境完全一样。(建议不要在自己常用环境尝试,一旦安装错误,就会卸载掉你的gpu环境!!!使你大多数情况下不能用)

 方法2:你头铁,非要在自己的环境下安装。请极其慎重的按照如下步骤安装

(如果使cpu环境,那不用考虑,直接安装最新版就行 pip install torchtext

(最好先新建一个环境尝试下,成功后再在自己环境按,不新建也行,一定要按步骤)

Step1:查看自己的pytoch版本

  1. import torch
  2. print(torch.cuda.is_available())
  3. print(torch.__version__)

 Step2:计算torchtext版本号

 我的版本为1.13.1。那么请记住安装公式,设版本号为1.a.b我的a=13,b=1。那么你安装的torchtext版本应该为0.(a+1). b 所以我安装的版本为0.14.1。

Step3:安装

pip install torchtext==0.14.1(0.a+1.b)

此时应该能正常运作,除非你出现了意外,此时再查看并安装一下对应的torchdata版本号就可

N4:调用与搭建word2vec网络进行训练

 思路:

1导包

2数据集处理

3dataset and dataloader建立

4model 建立

5训练

6评估

1导包

  1. import torch
  2. import torch.nn as nn
  3. import warnings
  4. import pandas as pd
  5. import torchvision
  6. from torchvision import transforms,datasets
  7. warnings.filterwarnings('ignore')
  8. device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
  9. print(device)

2数据集处理

  1. train_df=pd.read_csv('train.csv',sep='\t',header=None)
  2. print(train_df.head)
  3. x=train_df[0].values[:]
  4. y=train_df[1].values[:]
  5. #%%
  6. from gensim.models.word2vec import Word2Vec
  7. import numpy as np
  8. #训练word2vec浅层网络模型
  9. w2v=Word2Vec(vector_size=100,min_count=3)
  10. #vector_size指特征向量维度,默认为100
  11. #对词频少于min_count的单词进行截断
  12. w2v.build_vocab(x)
  13. w2v.train(x,total_examples=w2v.corpus_count,
  14. epochs=20)
  15. #定义将文本转化为向量的函数
  16. def total_vec(text):
  17. vec=np.zeros(100).reshape((1,100))
  18. for word in text:
  19. try:
  20. vec+=w2v.wv[word].reshape((1,100))
  21. except:
  22. continue
  23. return vec
  24. #将词向量保存为ndarray
  25. #x_vec=np.concatenate([total_vec(z) for z in x])
  26. #上述函数只是为了保存与显示,实际训练中并没有用
  27. #保存word2vec模型及词向量
  28. w2v.save('w2v_model.pkl')

 数据集见前期文章N2

w2v=Word2Vec(vector_size=100,min_count=3)实例化网络

w2v.build_vocab(x)以数据集重建词表

注意word2vec建立的词表都是单个字建的,没有切词。比如‘双鸭山’这个词,只有,双,鸭,山的词嵌入,没有双鸭,鸭山,双鸭山的词嵌入。

w2v.train()进行训练

注意一定要用w2v.wv[word].reshape((1,100)),否则在np.concatenate([],axis=1)要在concatenate中声明维度按列拼接。reshape的意思是把以为向量(100,)变为二维向量(1,100)前者为[1,2,3,..,100],后者为[[1,2,3,..,100]]的形式

3dataset and dataloader建立

  1. label_name=list(set(train_df[1].values[:]))
  2. print(label_name)
  3. text_pipeline=lambda x:total_vec(x)
  4. label_pipeline=lambda x:label_name.index(x)
  5. from torch.utils.data import DataLoader
  6. def collate_batch(batch):
  7. label_list,text_list=[],[]
  8. for (textt,labell) in batch:
  9. label_list.append(label_pipeline(labell))
  10. processed_text=torch.tensor(text_pipeline(textt),dtype=torch.float32)
  11. text_list.append(processed_text)
  12. label_list=torch.tensor(label_list,dtype=torch.int64)
  13. text_list=torch.cat(text_list)
  14. return text_list.to(device),label_list.to(device)
  15. def coustom_data_iter(texts,labels):
  16. for x,y in zip(texts,labels):
  17. yield x,y
  18. from torch.utils.data.dataset import random_split
  19. from torchtext.data.functional import to_map_style_dataset
  20. train_iter = coustom_data_iter(x,y)
  21. train_dataset = to_map_style_dataset(train_iter)
  22. split_train_, split_valid_ = random_split(train_dataset,
  23. [int(len(train_dataset)*0.8),int(len(train_dataset)*0.2)])
  24. train_dataloader = DataLoader(split_train_, batch_size=batch_size,
  25. shuffle=True, collate_fn=collate_batch)
  26. valid_dataloader = DataLoader(split_valid_, batch_size=batch_size,
  27. shuffle=True, collate_fn=collate_batch)

4model 建立

  1. class TextClassificationModel(nn.Module):
  2. def __init__(self, num_class):
  3. super().__init__()
  4. self.fc = nn.Linear(100, num_class)
  5. def forward(self, text):
  6. return self.fc(text)

 就是一个简单的MLP层

5训练

  1. #%%训练评估函数
  2. import time
  3. Epochs = 20
  4. Learning_rate = 5
  5. batch_size = 64
  6. model = TextClassificationModel(len(label_name)).to(device)
  7. criterion = torch.nn.CrossEntropyLoss()
  8. optimizer = torch.optim.SGD(model.parameters(), lr=Learning_rate)
  9. scheduler = torch.optim.lr_scheduler.StepLR(optimizer, 1.0, gamma=0.1)
  10. total_accu = None
  11. num_class = len(label_name)
  12. vocab_size = 100000
  13. em_size = 12
  14. def train(dataloader):
  15. model.train() # 切换为训练模式
  16. total_acc, train_loss, total_count = 0, 0, 0
  17. log_interval = 50
  18. start_time = time.time()
  19. for idx, (text,label) in enumerate(dataloader):
  20. predicted_label = model(text)
  21. optimizer.zero_grad() # grad属性归零
  22. loss = criterion(predicted_label, label) # 计算网络输出和真实值之间的差距,label为真实值
  23. loss.backward() # 反向传播
  24. torch.nn.utils.clip_grad_norm_(model.parameters(), 0.1) # 梯度裁剪
  25. optimizer.step() # 每一步自动更新
  26. # 记录acc与loss
  27. total_acc += (predicted_label.argmax(1) == label).sum().item()
  28. train_loss += loss.item()
  29. total_count += label.size(0)
  30. def evaluate(dataloader):
  31. model.eval() # 切换为测试模式
  32. total_acc, train_loss, total_count = 0, 0, 0
  33. with torch.no_grad():
  34. for idx, (text,label) in enumerate(dataloader):
  35. predicted_label = model(text)
  36. loss = criterion(predicted_label, label) # 计算loss值
  37. # 记录测试数据
  38. total_acc += (predicted_label.argmax(1) == label).sum().item()
  39. train_loss += loss.item()
  40. total_count += label.size(0)
  41. return total_acc/total_count, train_loss/total_count
  42. #%%训练模型
  43. for epoch in range(1, Epochs + 1):
  44. epoch_start_time = time.time()
  45. train(train_dataloader)
  46. val_acc, val_loss = evaluate(valid_dataloader)
  47. # 获取当前的学习率
  48. lr = optimizer.state_dict()['param_groups'][0]['lr']
  49. if total_accu is not None and total_accu > val_acc:
  50. scheduler.step()
  51. else:
  52. total_accu = val_acc
  53. print('-' * 69)
  54. print('| epoch {:1d} | time: {:4.2f}s | '
  55. 'valid_acc {:4.3f} valid_loss {:4.3f} | lr {:4.6f}'.format(epoch,
  56. time.time() - epoch_start_time,
  57. val_acc,val_loss,lr))
  58. print('-' * 69)

6评估

  1. #%%对指定内容进行测试
  2. def predict(text, text_pipeline):
  3. with torch.no_grad():
  4. text = torch.tensor(text_pipeline(text), dtype=torch.float32)
  5. print(text.shape)
  6. output = model(text)
  7. return output.argmax(1).item()
  8. # ex_text_str = "随便播放一首专辑阁楼里的佛里的歌"
  9. ex_text_str = "还有双鸭山到淮阴的汽车票吗13号的"
  10. model = model.to("cpu")
  11. print("该文本的类别是:%s" %label_name[predict(ex_text_str, text_pipeline)])

结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/372571
推荐阅读
相关标签
  

闽ICP备14008679号