文章主题:AI赛, 全流程, bug排除, 依赖包安装
这次有幸参加DataWhale的AI夏令营 ,在本次学习中我收获良多。以下是我的收获:
一、体验到AI赛的全流程:
二、学会排除bug的方法:
1、自己解决
在编程过程中,难免会遇到各种不同的错误,其中最常见的就是依赖包的缺失。当遇到这种情况时,我们可以通过在终端中输入相应的命令来解决。比如,如果缺少了sentence_transformers这个包,我们只需要在终端中输入以下命令即可进行安装:“`pip install sentence-transformers“`这样就可以顺利地安装所需的依赖包,从而避免程序运行时出现错误或异常。
pip install sentence_transformers(2)善于利用搜索引擎和GPT
2、寻求大佬的帮助
作为一名学习者,开源学习所带来的优势之一便是学习伙伴的存在。这些伙伴中涵盖了许多我们敬仰的专家和大师。当我们遇到难以攻破的难题时,自然可以向他们寻求解答,然而时间对于每个人来说都是宝贵的。因此,在提出问题之前,我们必须先付出自己的努力去尝试解决问题。同时,在提问的过程中,我们也应确保所提供的信息尽可能全面,以便于得到更精确的解答。
– 运行环境(电脑系统版本、Python 版本)
– 完整的报错信息(截图或复制均可,但是请保持完整)
– 描述你期望看到的结果
– 阐述你尝试的过程和得到的结果, 并针对这些尝试结果进行分析, 给出自己的思考(非常重要且必须的)
三、感受到开源学习的乐趣
四、以下是我copy的项目代码:
(一)使用预训练的BERT模型解决文本二分类问题
#加载前置依赖包import osimport pandas as pdimport torchfrom torch import nnfrom torch.utils.data import Dataset, DataLoader# 用于加载bert模型的分词器from transformers import AutoTokenizer# 用于加载bert模型from transformers import BertModelfrom pathlib import Path#设置全局设置batch_size = 16# 文本的最大长度text_max_length = 128# 总训练的epochs数,我只是随便定义了个数epochs = 100# 学习率lr = 3e-5# 取多少训练集的数据作为验证集validation_ratio = 0.1device = torch.device(cuda if torch.cuda.is_available() else cpu)# 每多少步,打印一次losslog_per_step = 50# 数据集所在位置dataset_dir = Path(“G:\data\paper”)os.makedirs(dataset_dir) if not os.path.exists(dataset_dir) else # 模型存储路径model_dir = Path(“./model/bert_checkpoints”)# 如果模型目录不存在,则创建一个os.makedirs(model_dir) if not os.path.exists(model_dir) else print(“Device:”, device)# 读取数据集,进行数据处理pd_train_data = pd.read_csv(G:\data\paper/train.csv)pd_train_data[title] = pd_train_data[title].fillna()pd_train_data[abstract] = pd_train_data[abstract].fillna()test_data = pd.read_csv(G:\data\paper/test.csv)test_data[title] = test_data[title].fillna()test_data[abstract] = test_data[abstract].fillna()pd_train_data[text] = pd_train_data[title].fillna() + + pd_train_data[author].fillna() + + pd_train_data[abstract].fillna()+ + pd_train_data[Keywords].fillna()test_data[text] = test_data[title].fillna() + + test_data[author].fillna() + + test_data[abstract].fillna()+ + pd_train_data[Keywords].fillna()# 从训练集中随机采样测试集validation_data = pd_train_data.sample(frac=validation_ratio)train_data = pd_train_data[~pd_train_data.index.isin(validation_data.index)]# 构建Datasetclass MyDataset(Dataset): def __init__(self, mode=train): super(MyDataset, self).__init__() self.mode = mode # 拿到对应的数据 if mode == train: self.dataset = train_data elif mode == validation: self.dataset = validation_data elif mode == test: # 如果是测试模式,则返回内容和uuid。拿uuid做target主要是方便后面写入结果。 self.dataset = test_data else: raise Exception(“Unknown mode {}”.format(mode)) def __getitem__(self, index): # 取第index条 data = self.dataset.iloc[index] # 取其内容 text = data[text] # 根据状态返回内容 if self.mode == test: # 如果是test,将uuid做为target label = data[uuid] else: label = data[label] # 返回内容和label return text, label def __len__(self): return len(self.dataset)train_dataset = MyDataset(train)validation_dataset = MyDataset(validation)train_dataset.__getitem__(0)#获取Bert预训练模型tokenizer = AutoTokenizer.from_pretrained(“bert-base-uncased”,mirror=tuna)def collate_fn(batch): “”” 将一个batch的文本句子转成tensor,并组成batch。 :param batch: 一个batch的句子,例如: [(推文, target), (推文, target), …] :return: 处理后的结果,例如: src: {input_ids: tensor([[ 101, …, 102, 0, 0, …], …]), attention_mask: tensor([[1, …, 1, 0, …], …])} target:[1, 1, 0, …] “”” text, label = zip(*batch) text, label = list(text), list(label) # src是要送给bert的,所以不需要特殊处理,直接用tokenizer的结果即可 # padding=max_length 不够长度的进行填充 # truncation=True 长度过长的进行裁剪 src = tokenizer(text, padding=max_length, max_length=text_max_length, return_tensors=pt, truncation=True) return src, torch.LongTensor(label)train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn)validation_loader = DataLoader(validation_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn)inputs, targets = next(iter(train_loader))print(“inputs:”, inputs)print(“targets:”, targets)class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() # 加载bert模型 self.bert = BertModel.from_pretrained(bert-base-uncased, mirror=tuna) # 最后的预测层 self.predictor = nn.Sequential( nn.Linear(768, 256), nn.ReLU(), nn.Linear(256, 1), nn.Sigmoid() ) def forward(self, src): “”” :param src: 分词后的推文数据 “”” # 将src直接序列解包传入bert,因为bert和tokenizer是一套的,所以可以这么做。 # 得到encoder的输出,用最前面[CLS]的输出作为最终线性层的输入 outputs = self.bert(**src).last_hidden_state[:, 0, :] # 使用线性层来做最终的预测 return self.predictor(outputs)model = MyModel()model = model.to(device)criteria = nn.BCELoss()optimizer = torch.optim.Adam(model.parameters(), lr=lr)# 由于inputs是字典类型的,定义一个辅助函数帮助to(device)def to_device(dict_tensors): result_tensors = {} for key, value in dict_tensors.items(): result_tensors[key] = value.to(device) return result_tensorsdef validate(): model.eval() total_loss = 0. total_correct = 0 for inputs, targets in validation_loader: inputs, targets = to_device(inputs), targets.to(device) outputs = model(inputs) loss = criteria(outputs.view(-1), targets.float()) total_loss += float(loss) correct_num = (((outputs >= 0.5).float() * 1).flatten() == targets).sum() total_correct += correct_num return total_correct / len(validation_dataset), total_loss / len(validation_dataset)# 首先将模型调成训练模式model.train()# 清空一下cuda缓存if torch.cuda.is_available(): torch.cuda.empty_cache()# 定义几个变量,帮助打印losstotal_loss = 0.# 记录步数step = 0# 记录在验证集上最好的准确率best_accuracy = 0# 开始训练for epoch in range(epochs): model.train() for i, (inputs, targets) in enumerate(train_loader): # 从batch中拿到训练数据 inputs, targets = to_device(inputs), targets.to(device) # 传入模型进行前向传递 outputs = model(inputs) # 计算损失 loss = criteria(outputs.view(-1), targets.float()) loss.backward() optimizer.step() optimizer.zero_grad() total_loss += float(loss) step += 1 if step % log_per_step == 0: print(“Epoch {}/{}, Step: {}/{}, total loss:{:.4f}”.format(epoch+1, epochs, i, len(train_loader), total_loss)) total_loss = 0 del inputs, targets # 一个epoch后,使用过验证集进行验证 accuracy, validation_loss = validate() print(“Epoch {}, accuracy: {:.4f}, validation loss: {:.4f}”.format(epoch+1, accuracy, validation_loss)) torch.save(model, model_dir / f”model_{epoch}.pt”) # 保存最好的模型 if accuracy > best_accuracy: torch.save(model, model_dir / f”model_best.pt”) best_accuracy = accuracymodel = torch.load(model_dir / f”model_best.pt”)model = model.eval()test_dataset = MyDataset(test)test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn)results = []for inputs, ids in test_loader: outputs = model(inputs.to(device)) outputs = (outputs >= 0.5).int().flatten().tolist() ids = ids.tolist() results = results + [(id, result) for result, id in zip(outputs, ids)]test_label = [pair[1] for pair in results]test_data[label] = test_labeltest_data[[uuid, Keywords, label]].to_csv(submit_task1.csv, index=None)
AI时代,拥有个人微信机器人AI助手!AI时代不落人后!
免费ChatGPT问答,办公、写作、生活好得力助手!
搜索微信号AIGC666aigc999或上边扫码,即可拥有个人AI助手!