当前位置:   article > 正文

命名实体识别代码阅读_datasets.load_from_disk

datasets.load_from_disk

中文命名实体识别 BERT中文任务实战 18分钟快速实战_哔哩哔哩_bilibili

注意注释

  1. from transformers import AutoTokenizer
  2. import time # 时间
  3. start = time.time()
  4. #加载分词器
  5. tokenizer = AutoTokenizer.from_pretrained('hfl/rbt6') #中文bert
  6. print(tokenizer)
  7. #分词测试,并没有输入数据集,这行是在jupyterbook上查看分词是否运行的
  8. tokenizer.batch_encode_plus(
  9. [[
  10. '海', '钓', '比', '赛', '地', '点', '在', '厦', '门', '与', '金', '门', '之', '间',
  11. '的', '海', '域', '。'
  12. ],
  13. [
  14. '这', '座', '依', '山', '傍', '水', '的', '博', '物', '馆', '由', '国', '内', '一',
  15. '流', '的', '设', '计', '师', '主', '持', '设', '计', ',', '整', '个', '建', '筑',
  16. '群', '精', '美', '而', '恢', '宏', '。'
  17. ]], #输入两个句子做测试
  18. truncation=True,
  19. padding=True,
  20. return_tensors='pt', #转为tensor
  21. is_split_into_words=True) #告诉编码器句子已经分词

数据集

  1. import torch
  2. from datasets import load_dataset, load_from_disk
  3. class Dataset(torch.utils.data.Dataset):
  4. def __init__(self, split):
  5. #names=['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC'],用记事本打开文件看到的,如果文本中有个人名,则label为122,三个字的名字
  6. #在线加载数据集
  7. #dataset = load_dataset(path='peoples_daily_ner', split=split)
  8. #离线加载数据集
  9. dataset = load_from_disk(dataset_path='./data')[split]
  10. #过滤掉太长的句子
  11. def f(data):
  12. return len(data['tokens']) <= 512 - 2
  13. dataset = dataset.filter(f)
  14. self.dataset = dataset
  15. def __len__(self):
  16. return len(self.dataset)
  17. def __getitem__(self, i):
  18. tokens = self.dataset[i]['tokens']
  19. labels = self.dataset[i]['ner_tags'] #这两个标签应该是命名实体数据集默认的,因为people数据集只有那几个实体标签,o,b,i
  20. return tokens, labels
  21. dataset = Dataset('train')
  22. tokens, labels = dataset[0] #label是有实体就标注,比如5,6,无实体就0
  23. len(dataset), tokens, labels

 分别对应形态

数据整理(注释)

  1. #数据整理函数
  2. def collate_fn(data):
  3. tokens = [i[0] for i in data] #由batch_size决定
  4. labels = [i[1] for i in data] #i[1]是因为第一个label是cls
  5. inputs = tokenizer.batch_encode_plus(tokens,
  6. truncation=True,
  7. padding=True,
  8. return_tensors='pt',
  9. is_split_into_words=True) #对句子分词
  10. #print(tokenizer.decode(inputs['input_ids'][0]))
  11. #print(labels[0])
  12. #print(tokenizer.decode(inputs['input_ids'][0]))
  13. lens = inputs['input_ids'].shape[1] #找出这一批次句子中最长的那句,lens代表当前句子加上cls,pad,sep的词个数
  14. #print(lens)
  15. for i in range(len(labels)): #用7 代表补充的部分
  16. labels[i] = [7] + labels[i] #每个label的头部补充7,[7]是加在label[0]上,即cls变为7,【7, 0, 3, 4, 4, 4,。。。】
  17. #print('头',labels[i])
  18. labels[i] += [7] * lens #每个label的尾部补充lens个数的7
  19. #print('尾',labels[i])
  20. labels[i] = labels[i][:lens] #所有句子统一裁剪到最长句子的长度
  21. return inputs, torch.LongTensor(labels)
labels = [i[1]:这里为i[1]是因为label的第一个是cls,可看下图

  1. #查看数据样例
  2. for i, (inputs, labels) in enumerate(loader):
  3. break
  4. print(len(loader))
  5. print(tokenizer.decode(inputs['input_ids'][0]))
  6. print(labels[0])
  7. for k, v in inputs.items(): #input_ids torch.Size([16, 95]),16是batch_size,95是不定的,是lens
  8. print(k, v.shape)
  9. from transformers import AutoModel
  10. #加载预训练模型
  11. pretrained = AutoModel.from_pretrained('hfl/rbt6')
  12. pretrained = pretrained.cuda() #预训练也要在gpu上运行,重点
  13. #统计参数量
  14. print(sum(i.numel() for i in pretrained.parameters()) / 10000)
  15. #模型试算
  16. #[b, lens] -> [b, lens, 768]
  17. for k, v in inputs.data.items(): #这里因为inputs属于字典形式,data数据是有三个,都是tensor形式,被inputs包裹,所以需要分别放在gpu上
  18. inputs.data[k] = v.cuda()
  19. pretrained(**inputs).last_hidden_state.shape

pretrained = pretrained.cuda():预训练模型也放在CUDA上。

然后底下的inputs数据放cuda上,下面train()有解释

模型定义 

【python】——Python中的*和**的作用和含义_Kadima°的博客-CSDN博客_python * **

理解‘*‘,‘*args‘,‘**‘,‘**kwargs‘_callinglove的博客-CSDN博客

  1. #定义下游模型
  2. class Model(torch.nn.Module):
  3. def __init__(self):
  4. super().__init__()
  5. self.tuneing = False #fineturn预设为0
  6. self.pretrained = None #默认情况下,预训练模型不属于下游任务的一部分
  7. #下游任务
  8. self.rnn = torch.nn.GRU(768, 768,batch_first=True)
  9. self.fc = torch.nn.Linear(768, 8)
  10. def forward(self, inputs):
  11. if self.tuneing: #如果tuning,则认为自己的预训练模型也要训练
  12. out = self.pretrained(**inputs).last_hidden_state
  13. else: #如果不tuning,则使用外部的预训练模型
  14. with torch.no_grad():
  15. out = pretrained(**inputs).last_hidden_state
  16. out, _ = self.rnn(out) #这个,_可看lstm示例代码
  17. #print('前',out.shape)
  18. out = self.fc(out).softmax(dim=2) #前 torch.Size([128, 157, 768]),fc层降为8,所以dim=2
  19. #print(out.shape)
  20. return out
  21. def fine_tuneing(self, tuneing):
  22. self.tuneing = tuneing #tuning模式下,预训练模型参数更新
  23. if tuneing:
  24. for i in pretrained.parameters():
  25. i.requires_grad = True
  26. pretrained.train() #预训练模型训练模式
  27. self.pretrained = pretrained #预训练模型属于自己模型的一部分
  28. else:
  29. for i in pretrained.parameters():
  30. i.requires_grad_(False)
  31. pretrained.eval()
  32. self.pretrained = None
  33. model = Model()
  34. model(inputs).shape

工具函数

  1. #对计算结果和label变形,并且自注意力机制移除pad
  2. def reshape_and_remove_pad(outs, labels, attention_mask):
  3. #变形,便于计算loss
  4. #[b, lens, 8] -> [b*lens, 8],把n句话合并在一起
  5. outs = outs.reshape(-1, 8)
  6. #[b, lens] -> [b*lens],n句话的label拼合在一起
  7. labels = labels.reshape(-1)
  8. #忽略对pad的计算结果,自注意力筛选
  9. #[b, lens] -> [b*lens - pad]
  10. select = attention_mask.reshape(-1) == 1
  11. outs = outs[select]
  12. labels = labels[select]
  13. return outs, labels
  14. #获取正确数量和总数
  15. def get_correct_and_total_count(labels, outs):
  16. #[b*lens, 8] -> [b*lens]
  17. outs = outs.argmax(dim=1) #实体标签,筛选出概率最大的那个值
  18. correct = (outs == labels).sum().item()
  19. total = len(labels)
  20. #计算除了0以外元素的正确率,因为0太多了,包括的话,正确率很容易虚高
  21. select = labels != 0
  22. outs = outs[select]
  23. labels = labels[select]
  24. correct_content = (outs == labels).sum().item()
  25. total_content = len(labels)
  26. return correct, total, correct_content, total_content

train函数

  1. from transformers import AdamW
  2. # setting device on GPU if available, else CPU,检查是否GPU
  3. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  4. print('Using device:', device)
  5. #Additional Info when using cuda
  6. if device.type == 'cuda':
  7. print(torch.cuda.get_device_name(0))
  8. print('Memory Usage:')
  9. print('Allocated:', round(torch.cuda.memory_allocated(0) / 1024 ** 3, 1), 'GB')
  10. print('Cached: ', round(torch.cuda.memory_reserved(0) / 1024 ** 3, 1), 'GB')
  11. #训练
  12. def train(epochs):
  13. lr = 2e-5 if model.tuneing else 5e-4 #这里model.tuneing的值由下面model.fine_tuneing(True)决定
  14. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  15. #训练
  16. optimizer = AdamW(model.parameters(), lr=lr)
  17. criterion = torch.nn.CrossEntropyLoss()
  18. print('开始训练 ')
  19. model.train()
  20. for epoch in range(epochs):
  21. for step, (inputs, labels) in enumerate(loader):
  22. #模型计算s
  23. #[b, lens] -> [b, lens, 8]
  24. #inputs = inputs.to(device)
  25. for k, v in inputs.data.items(): #与上面一样
  26. inputs.data[k] = v.cuda()
  27. outs = model(inputs) #out没必要放在gpu中,labels和inputs需要
  28. labels = labels.to(device)
  29. #print('是否 ',outs.is_cuda, labels.is_cuda)
  30. #对outs和label变形,并且移除pad
  31. #outs -> [b, lens, 8] -> [c, 8]
  32. #labels -> [b, lens] -> [c]
  33. outs, labels = reshape_and_remove_pad(outs, labels,
  34. inputs['attention_mask'])
  35. #梯度下降
  36. loss = criterion(outs, labels).to(device)
  37. loss.backward()
  38. optimizer.step()
  39. optimizer.zero_grad()
  40. if step % 50 == 0:
  41. counts = get_correct_and_total_count(labels, outs)
  42. accuracy = counts[0] / counts[1]
  43. accuracy_content = counts[2] / counts[3]
  44. print(epoch, step, loss.item(), accuracy, accuracy_content)
  45. torch.save(model, 'model/命名实体识别_中文.model')

这里头一段是检查是否能使用GPU,输出现在使用的显卡

for k, v in inputs.data.items():  
    inputs.data[k] = v.cuda()

因为要想使用GPU来训练,要把输入数据放在GPU上 ,但因为这里的inputs数据类型不是tensor,在前面**inputs时是dict字典形式,在inputs内部的数据是tensor形式,所以这里把inputs内部的数据通过循环都放在cuda上。

执行过程为通过 itmes() 方法将字典数据转化为 元组对 的形式,然后通过for 语句将 key 值赋给变量 k ,将 value 值赋给变量 v ,直至遍历结束

labels = labels.to(device)  标签也放在cuda上

至于outs其实不用 

训练和测试

  1. #model.fine_tuneing(False)
  2. #train(500)
  3. print('参数量 ',sum(p.numel() for p in model.parameters()) / 10000)
  4. #train(1)
  5. model.fine_tuneing(True)
  6. train(200)
  7. print(sum(p.numel() for p in model.parameters()) / 10000)
  8. #train(2)
  9. #测试
  10. def test():
  11. model_load = torch.load('model/命名实体识别_中文.model')
  12. model_load.eval()
  13. loader_test = torch.utils.data.DataLoader(dataset=Dataset('validation'),
  14. batch_size=128,
  15. collate_fn=collate_fn,
  16. shuffle=True,
  17. drop_last=True)
  18. correct = 0
  19. total = 0
  20. correct_content = 0
  21. total_content = 0
  22. for step, (inputs, labels) in enumerate(loader_test):
  23. if step == 5:
  24. break
  25. print(step)
  26. with torch.no_grad():
  27. #[b, lens] -> [b, lens, 8] -> [b, lens]
  28. for k, v in inputs.data.items(): #与上面一样,都放进cuda
  29. inputs.data[k] = v.cuda()
  30. labels = labels.cuda()
  31. outs = model_load(inputs)
  32. #对outs和label变形,并且移除pad
  33. #outs -> [b, lens, 8] -> [c, 8]
  34. #labels -> [b, lens] -> [c]
  35. outs, labels = reshape_and_remove_pad(outs, labels,
  36. inputs['attention_mask'])
  37. counts = get_correct_and_total_count(labels, outs)
  38. correct += counts[0]
  39. total += counts[1]
  40. correct_content += counts[2]
  41. total_content += counts[3]
  42. print(correct / total, correct_content / total_content)
  43. test()
  44. # 测试
  45. def predict():
  46. model_load = torch.load('model/命名实体识别_中文.model')
  47. model_load.eval()
  48. loader_test = torch.utils.data.DataLoader(dataset=Dataset('validation'),
  49. batch_size=32,
  50. collate_fn=collate_fn,
  51. shuffle=True,
  52. drop_last=True)
  53. for i, (inputs, labels) in enumerate(loader_test):
  54. break
  55. with torch.no_grad():
  56. # [b, lens] -> [b, lens, 8] -> [b, lens]
  57. for k, v in inputs.data.items(): # 与上面一样,都放进cuda
  58. inputs.data[k] = v.cuda()
  59. labels = labels.cuda()
  60. outs = model_load(inputs).argmax(dim=2)
  61. for i in range(32):
  62. # 移除pad
  63. select = inputs['attention_mask'][i] == 1
  64. input_id = inputs['input_ids'][i, select]
  65. out = outs[i, select]
  66. label = labels[i, select]
  67. # 输出原句子
  68. print(tokenizer.decode(input_id).replace(' ', ''))
  69. # 输出tag
  70. for tag in [label, out]:
  71. s = ''
  72. for j in range(len(tag)):
  73. if tag[j] == 0:
  74. s += '·'
  75. continue
  76. s += tokenizer.decode(input_id[j])
  77. s += str(tag[j].item())
  78. print(s)
  79. print('==========================')
  80. predict()
  81. end=time.time()
  82. print('Running time: %s Seconds'%(end-start))

完整代码(使用GPU加速的bert命名实体识别),后面再加CRF

  1. from transformers import AutoTokenizer
  2. import time # 时间
  3. import torch
  4. from datasets import load_dataset, load_from_disk
  5. start = time.time()
  6. #加载分词器
  7. tokenizer = AutoTokenizer.from_pretrained('hfl/rbt6') #中文bert
  8. print(tokenizer)
  9. #分词测试,并没有输入数据集,这行是在jupyterbook上查看分词是否运行的
  10. tokenizer.batch_encode_plus(
  11. [[
  12. '海', '钓', '比', '赛', '地', '点', '在', '厦', '门', '与', '金', '门', '之', '间',
  13. '的', '海', '域', '。'
  14. ],
  15. [
  16. '这', '座', '依', '山', '傍', '水', '的', '博', '物', '馆', '由', '国', '内', '一',
  17. '流', '的', '设', '计', '师', '主', '持', '设', '计', ',', '整', '个', '建', '筑',
  18. '群', '精', '美', '而', '恢', '宏', '。'
  19. ]], #输入两个句子做测试
  20. truncation=True,
  21. padding=True,
  22. return_tensors='pt', #转为tensor
  23. is_split_into_words=True) #告诉编码器句子已经分词
  24. class Dataset(torch.utils.data.Dataset):
  25. def __init__(self, split):
  26. #names=['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC'],用记事本打开文件看到的,如果文本中有个人名,则label为122,三个字的名字
  27. #在线加载数据集
  28. #dataset = load_dataset(path='peoples_daily_ner', split=split)
  29. #离线加载数据集
  30. dataset = load_from_disk(dataset_path='./data')[split]
  31. #过滤掉太长的句子
  32. def f(data):
  33. return len(data['tokens']) <= 512 - 2
  34. dataset = dataset.filter(f)
  35. self.dataset = dataset
  36. def __len__(self):
  37. return len(self.dataset)
  38. def __getitem__(self, i):
  39. tokens = self.dataset[i]['tokens']
  40. labels = self.dataset[i]['ner_tags'] #这两个标签应该是命名实体数据集默认的,因为people数据集只有那几个实体标签,o,b,i
  41. return tokens, labels
  42. dataset = Dataset('train')
  43. tokens, labels = dataset[0] #label是有实体就标注,比如5,6,无实体就0
  44. len(dataset), tokens, labels
  45. #数据整理函数
  46. def collate_fn(data):
  47. tokens = [i[0] for i in data] #由batch_size决定
  48. labels = [i[1] for i in data] #i[1]是因为第一个label是cls
  49. inputs = tokenizer.batch_encode_plus(tokens,
  50. truncation=True,
  51. padding=True,
  52. return_tensors='pt',
  53. is_split_into_words=True) #对句子分词
  54. #print(tokenizer.decode(inputs['input_ids'][0]))
  55. #print(labels[0])
  56. #print(tokenizer.decode(inputs['input_ids'][0]))
  57. lens = inputs['input_ids'].shape[1] #找出这一批次句子中最长的那句,lens代表当前句子加上cls,pad,sep的词个数
  58. #print(lens)
  59. for i in range(len(labels)): #用7 代表补充的部分
  60. labels[i] = [7] + labels[i] #每个label的头部补充7,[7]是加在label[0]上,即cls变为7,【7, 0, 3, 4, 4, 4,。。。】
  61. #print('头',labels[i])
  62. labels[i] += [7] * lens #每个label的尾部补充lens个数的7
  63. #print('尾',labels[i])
  64. labels[i] = labels[i][:lens] #所有句子统一裁剪到最长句子的长度
  65. return inputs, torch.LongTensor(labels)
  66. #数据加载器
  67. loader = torch.utils.data.DataLoader(dataset=dataset,
  68. batch_size=8, #batch_size如果是16,则在tuning=true时gpu显存不足
  69. collate_fn=collate_fn,
  70. shuffle=True,
  71. drop_last=True)
  72. #查看数据样例
  73. for i, (inputs, labels) in enumerate(loader):
  74. break
  75. print(len(loader))
  76. print(tokenizer.decode(inputs['input_ids'][0]))
  77. print(labels[0])
  78. for k, v in inputs.items(): #input_ids torch.Size([16, 95]),16是batch_size,95是不定的,是lens
  79. print(k, v.shape)
  80. from transformers import AutoModel
  81. #加载预训练模型
  82. pretrained = AutoModel.from_pretrained('hfl/rbt6')
  83. pretrained = pretrained.cuda() #预训练也要在gpu上运行,重点
  84. #统计参数量
  85. print(sum(i.numel() for i in pretrained.parameters()) / 10000)
  86. #模型试算
  87. #[b, lens] -> [b, lens, 768]
  88. for k, v in inputs.data.items(): #这里因为inputs属于字典形式,data数据是有三个,都是tensor形式,被inputs包裹,所以需要分别放在gpu上
  89. inputs.data[k] = v.cuda()
  90. pretrained(**inputs).last_hidden_state.shape
  91. #定义下游模型
  92. class Model(torch.nn.Module):
  93. def __init__(self):
  94. super().__init__()
  95. self.tuneing = False #fineturn预设为0
  96. self.pretrained = None #默认情况下,预训练模型不属于下游任务的一部分
  97. #下游任务
  98. self.rnn = torch.nn.GRU(768, 768,batch_first=True)
  99. self.fc = torch.nn.Linear(768, 8)
  100. def forward(self, inputs):
  101. if self.tuneing: #如果tuning,则认为自己的预训练模型也要训练
  102. out = self.pretrained(**inputs).last_hidden_state
  103. else: #如果不tuning,则使用外部的预训练模型
  104. with torch.no_grad():
  105. out = pretrained(**inputs).last_hidden_state #inputs是字典形式,dict
  106. out, _ = self.rnn(out) #这个,_可看lstm示例代码
  107. #print('前',out.shape)
  108. out = self.fc(out).softmax(dim=2) #前 torch.Size([128, 157, 768]),fc层降为8,所以dim=2
  109. #print(out.shape)
  110. return out
  111. def fine_tuneing(self, tuneing):
  112. self.tuneing = tuneing #tuning模式下,预训练模型参数更新
  113. if tuneing:
  114. for i in pretrained.parameters():
  115. i.requires_grad = True
  116. pretrained.train() #预训练模型训练模式
  117. self.pretrained = pretrained #预训练模型属于自己模型的一部分
  118. else:
  119. for i in pretrained.parameters():
  120. i.requires_grad_(False)
  121. pretrained.eval()
  122. self.pretrained = None
  123. model = Model().cuda()
  124. #对计算结果和label变形,并且自注意力机制移除pad
  125. def reshape_and_remove_pad(outs, labels, attention_mask):
  126. #变形,便于计算loss
  127. #[b, lens, 8] -> [b*lens, 8],把n句话合并在一起
  128. outs = outs.reshape(-1, 8)
  129. #[b, lens] -> [b*lens],n句话的label拼合在一起
  130. labels = labels.reshape(-1)
  131. #忽略对pad的计算结果,自注意力筛选
  132. #[b, lens] -> [b*lens - pad]
  133. select = attention_mask.reshape(-1) == 1
  134. outs = outs[select]
  135. labels = labels[select]
  136. return outs, labels
  137. #获取正确数量和总数
  138. def get_correct_and_total_count(labels, outs):
  139. #[b*lens, 8] -> [b*lens]
  140. outs = outs.argmax(dim=1) #实体标签,筛选出概率最大的那个值
  141. correct = (outs == labels).sum().item()
  142. total = len(labels)
  143. #计算除了0以外元素的正确率,因为0太多了,包括的话,正确率很容易虚高
  144. select = labels != 0
  145. outs = outs[select]
  146. labels = labels[select]
  147. correct_content = (outs == labels).sum().item()
  148. total_content = len(labels)
  149. return correct, total, correct_content, total_content
  150. from transformers import AdamW
  151. # setting device on GPU if available, else CPU,检查是否GPU
  152. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  153. print('Using device:', device)
  154. #Additional Info when using cuda
  155. if device.type == 'cuda':
  156. print(torch.cuda.get_device_name(0))
  157. print('Memory Usage:')
  158. print('Allocated:', round(torch.cuda.memory_allocated(0) / 1024 ** 3, 1), 'GB')
  159. print('Cached: ', round(torch.cuda.memory_reserved(0) / 1024 ** 3, 1), 'GB')
  160. #训练
  161. def train(epochs):
  162. lr = 2e-5 if model.tuneing else 5e-4 #这里model.tuneing的值由下面model.fine_tuneing(True)决定
  163. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  164. #训练
  165. optimizer = AdamW(model.parameters(), lr=lr)
  166. criterion = torch.nn.CrossEntropyLoss()
  167. print('开始训练 ')
  168. model.train()
  169. for epoch in range(epochs):
  170. for step, (inputs, labels) in enumerate(loader):
  171. #模型计算s
  172. #[b, lens] -> [b, lens, 8]
  173. #inputs = inputs.to(device)
  174. for k, v in inputs.data.items(): #与上面一样
  175. inputs.data[k] = v.cuda()
  176. outs = model(inputs) #out没必要放在gpu中,labels和inputs需要
  177. labels = labels.to(device)
  178. #print('是否 ',outs.is_cuda, labels.is_cuda)
  179. #对outs和label变形,并且移除pad
  180. #outs -> [b, lens, 8] -> [c, 8]
  181. #labels -> [b, lens] -> [c]
  182. outs, labels = reshape_and_remove_pad(outs, labels,
  183. inputs['attention_mask'])
  184. #梯度下降
  185. loss = criterion(outs, labels).to(device)
  186. loss.backward()
  187. optimizer.step()
  188. optimizer.zero_grad()
  189. if step % 50 == 0:
  190. counts = get_correct_and_total_count(labels, outs)
  191. accuracy = counts[0] / counts[1]
  192. accuracy_content = counts[2] / counts[3]
  193. print(epoch, step, loss.item(), accuracy, accuracy_content)
  194. torch.save(model, 'model/命名实体识别_中文.model')
  195. #model.fine_tuneing(False)
  196. #train(500)
  197. print('参数量 ',sum(p.numel() for p in model.parameters()) / 10000)
  198. #train(1)
  199. model.fine_tuneing(True)
  200. train(200)
  201. print(sum(p.numel() for p in model.parameters()) / 10000)
  202. #train(2)
  203. #测试
  204. def test():
  205. model_load = torch.load('model/命名实体识别_中文.model')
  206. model_load.eval()
  207. loader_test = torch.utils.data.DataLoader(dataset=Dataset('validation'),
  208. batch_size=128,
  209. collate_fn=collate_fn,
  210. shuffle=True,
  211. drop_last=True)
  212. correct = 0
  213. total = 0
  214. correct_content = 0
  215. total_content = 0
  216. for step, (inputs, labels) in enumerate(loader_test):
  217. if step == 5:
  218. break
  219. print(step)
  220. with torch.no_grad():
  221. #[b, lens] -> [b, lens, 8] -> [b, lens]
  222. for k, v in inputs.data.items(): #与上面一样,都放进cuda
  223. inputs.data[k] = v.cuda()

改成GPU版本后训练效果不太好:

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

闽ICP备14008679号