简单的句子分类
    之前的代码随便改一下就行
    本次亮点有

    1. 正负情感评论,分别读取后Random处理是本次的亮点
    2. 使用了下载后的数据集,之前都是默认位置(服务器网速太慢)https://zhuanlan.zhihu.com/p/147144376

    对于数据处理的还是有点随便,可能影响了最后的最优解
    最后正确率85%左右

    1. import numpy as np
    2. import time
    3. import copy
    4. import torch.nn as nn
    5. import torch.nn.functional as F
    6. import torch.optim as optim
    7. import torch.autograd as autograd
    8. import torch.nn.functional
    9. from torch.utils.data import Dataset, DataLoader
    10. from torchvision import transforms
    11. import warnings
    12. import torch
    13. import time
    14. import argparse
    15. import os
    16. from transformers import BertTokenizer
    17. from transformers import BertForSequenceClassification
    18. from transformers import BertConfig
    19. #from transformers import BertPreTrainedModel
    20. from transformers import BertModel
    21. print("----import successfully----")
    22. USE_CUDA = torch.cuda.is_available()
    23. #USE_CUDA=False
    24. tokenizer = BertTokenizer.from_pretrained("../../pretrain_model")
    25. pos_lines = open('../../data/classification/rt-polarity.pos', encoding='gb18030', errors='ignore').read().strip().split('\n')
    26. neg_lines = open('../../data/classification/rt-polarity.neg', encoding='gb18030', errors='ignore').read().strip().split('\n')
    27. print("----load data successfully----")
    28. train_data={}
    29. train_data['label']=[]
    30. train_data['text'] =[]
    31. class mydata:
    32. def __init__(self,data,label):
    33. self.data=data
    34. self.label=label
    35. data=[]
    36. for i in pos_lines:
    37. data.append(mydata(i,1))
    38. for i in neg_lines:
    39. data.append(mydata(i,0))
    40. #input_ids = torch.tensor(tokenizer.encode("美国", add_special_tokens=True)).unsqueeze(0) # Batch size 1
    41. import random
    42. random.shuffle(data)
    43. for i in data:
    44. train_data['text'].append(tokenizer.encode(i.data, add_special_tokens=False))
    45. train_data['label'].append(i.label)
    46. data_list=[]
    47. max_len=40
    48. for x in train_data['text']:
    49. if len(x)>=max_len:
    50. x=x[0:39]
    51. while len(x)<max_len:
    52. x.append(0)
    53. x.append(102)
    54. l = x
    55. x = [101]
    56. x.extend(l)
    57. #x=torch.tensor(x)
    58. data_list.append(x)
    59. eval_list=data_list[8000:]
    60. eval_label=train_data['label'][8000:]
    61. data_list=data_list[0:8000]
    62. train_label=train_data['label'][0:8000]
    63. print("datalabel len: ",len(data_list))
    64. print("datalist len: ",len(train_label))
    65. print("evallabel len: ",len(eval_label))
    66. print("evallist len: ",len(eval_list))
    67. train_label=torch.tensor(train_label)
    68. traindata_tensor = torch.Tensor(data_list)
    69. eval_label=torch.tensor(eval_label)
    70. eval_tensor = torch.Tensor(eval_list)
    71. #USE_CUDA=False
    72. if USE_CUDA:
    73. print("using GPU")
    74. traindata_tensor =traindata_tensor.cuda()
    75. train_label = train_label.cuda()
    76. eval_tensor=eval_tensor.cuda()
    77. eval_label = eval_label.cuda()
    78. def get_train_args():
    79. parser=argparse.ArgumentParser()
    80. parser.add_argument('--batch_size',type=int,default=1,help = '每批数据的数量')
    81. parser.add_argument('--nepoch',type=int,default=30,help = '训练的轮次')
    82. parser.add_argument('--lr',type=float,default=0.001,help = '学习率')
    83. parser.add_argument('--gpu',type=bool,default=True,help = '是否使用gpu')
    84. parser.add_argument('--num_workers',type=int,default=2,help='dataloader使用的线程数量')
    85. parser.add_argument('--num_labels',type=int,default=2,help='分类类数')
    86. parser.add_argument('--data_path',type=str,default='./data',help='数据路径')
    87. opt=parser.parse_args()
    88. print(opt)
    89. return opt
    90. def get_model(opt):
    91. model = BertForSequenceClassification.from_pretrained("../../pretrain_model",num_labels=opt.num_labels)
    92. #model = bert_.BertForSequenceClassification.from_pretrained('bert-base-cased', num_labels=opt.num_labels)
    93. #model = bert_LSTM.Net()
    94. return model
    95. def out_put(net,batchsize):
    96. test_list = []
    97. test_data['text'] = [(tokenizer.encode(x, add_special_tokens=False)) for x in test_data.text]
    98. max_len = 40
    99. i=0
    100. for x in test_data.text:
    101. i+=1
    102. if len(x) >= max_len:
    103. x = x[0:39]
    104. while len(x) < max_len:
    105. x.append(0)
    106. x.append(102)
    107. l = x
    108. x = [101]
    109. x.extend(l)
    110. # x=torch.tensor(x)
    111. test_list.append(x)
    112. print(i)
    113. test_data_tensor = torch.Tensor(test_list)
    114. if USE_CUDA:
    115. print("using GPU to out")
    116. test_data_tensor = test_data_tensor.cuda()
    117. result=[]
    118. with torch.no_grad():
    119. result_dataset = torch.utils.data.TensorDataset(test_data_tensor)
    120. result_dataloader = torch.utils.data.DataLoader(result_dataset, batch_size=batchsize, shuffle=False)
    121. index=0
    122. for X in result_dataloader:
    123. X=X[0]
    124. #print(type(X))
    125. #print(X.shape)
    126. if X.shape[0]!=batchsize:
    127. break
    128. X = X.long()
    129. outputs = net(X)
    130. logits = outputs[:2]
    131. _, predicted = torch.max(logits[0].data, 1)
    132. #print("predicttype",type(predicted))
    133. #print(predicted)
    134. for i in range(len(predicted)):
    135. result.append(i)
    136. print(len(result))
    137. while len(result)<3263:
    138. result.append(0)
    139. df_output = pd.DataFrame()
    140. aux = pd.read_csv(base_path + 'test.csv')
    141. df_output['id'] = aux['id']
    142. df_output['target'] = result
    143. df_output[['id', 'target']].to_csv(base_path + 's1mple.csv', index=False)
    144. print("reset the result csv")
    145. def eval(net,eval_data, eval_label,batch_size,pre):
    146. net.eval()
    147. #print("enter",net.state_dict()["classifier.bias"])
    148. dataset = torch.utils.data.TensorDataset(eval_data, eval_label)
    149. train_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=False)
    150. total=0
    151. correct=0
    152. with torch.no_grad():
    153. index = 0
    154. for X, y in train_iter:
    155. X = X.long()
    156. if X.size(0)!= batch_size:
    157. break
    158. outputs= net(X, labels=y)
    159. #print("enter2", net.state_dict()["classifier.bias"])
    160. loss, logits = outputs[:2]
    161. _, predicted = torch.max(logits.data, 1)
    162. total += X.size(0)
    163. correct += predicted.data.eq(y.data).cpu().sum()
    164. s = (((1.0*correct.numpy())/total))
    165. print("Eval right: ",correct.item()," total ",total,"Acc:",s)
    166. return s
    167. def train(net, train_data, train_label,eval_tensor,eval_label,num_epochs, learning_rate, batch_size):
    168. net.train()
    169. optimizer = optim.SGD(net.parameters(), lr=learning_rate,weight_decay=0)
    170. dataset = torch.utils.data.TensorDataset(train_data, train_label)
    171. train_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=True)
    172. pre=0
    173. for epoch in range(num_epochs):
    174. correct = 0
    175. total=0
    176. iter = 0
    177. for X, y in train_iter:
    178. iter += 1
    179. X = X.long()
    180. if X.size(0)!= batch_size:
    181. break
    182. optimizer.zero_grad()
    183. #print(type(y))
    184. #print(y)
    185. outputs= net(X, labels=y)
    186. #print(y)
    187. loss, logits = outputs[0],outputs[1]
    188. _, predicted = torch.max(logits.data, 1)
    189. #print("predicted",predicted)
    190. #print("answer", y)
    191. loss.backward()
    192. optimizer.step()
    193. #print(outputs[1].shape)
    194. #print(output)
    195. #print(outputs[1])
    196. total += X.size(0)
    197. correct += predicted.data.eq(y.data).cpu().sum()
    198. s = ("Acc:%.3f" %((1.0*correct.numpy())/total))
    199. print("Train Epoch ", str(epoch),"loss: ", loss.mean().item(),"Acc:", s)
    200. torch.save(net.state_dict(), 'model.pth')
    201. pre=eval(net,eval_tensor, eval_label,batch_size,pre)
    202. return
    203. opt = get_train_args()
    204. model=get_model(opt)
    205. #print(model)
    206. if USE_CUDA:
    207. model=model.cuda()
    208. #model.load_state_dict(torch.load('model.pkl'))
    209. train(model,traindata_tensor,train_label,eval_tensor,eval_label,5,0.0008,16)
    210. #model = torch.load('model.pkl')

    image.png