Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
HJHGJGHHG
GitHub Repository: HJHGJGHHG/CCF-BDCI-AQYI
Path: blob/main/Train_Test.py
153 views
1
import torch
2
import numpy as np
3
import pandas as pd
4
import torch.nn as nn
5
from tqdm import tqdm
6
from collections import defaultdict
7
from transformers import AdamW, get_linear_schedule_with_warmup
8
9
10
def get_parameters(model, model_init_lr, multiplier, classifier_lr):
11
parameters = []
12
lr = model_init_lr
13
for layer in range(24, -1, -1):
14
layer_params = {
15
'params': [p for n, p in model.named_parameters() if f'encoder.layer.{layer}.' in n],
16
'lr': lr
17
}
18
parameters.append(layer_params)
19
lr *= multiplier
20
classifier_params = {
21
'params': [p for n, p in model.named_parameters() if 'layer_norm' in n or 'linear' in n
22
or 'pooling' in n],
23
'lr': classifier_lr
24
}
25
parameters.append(classifier_params)
26
return parameters
27
28
29
def train(args, model, train_iter, val_iter):
30
# optimizer
31
no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
32
optimizer_grouped_parameters = [
33
{'params': [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)],
34
'weight_decay': 0.01},
35
{'params': [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}
36
]
37
parameters = get_parameters(model, args.lr, 0.95, 1e-4)
38
# optimizer = AdamW(optimizer_grouped_parameters, lr=args.lr)
39
optimizer = AdamW(parameters)
40
41
# scheduler
42
scheduler = get_linear_schedule_with_warmup(
43
optimizer,
44
num_warmup_steps=0,
45
num_training_steps=len(train_iter) * args.epochs
46
)
47
48
for epoch in range(args.epochs):
49
print('Epoch [{}/{}]'.format(epoch + 1, args.epochs))
50
model = model.train()
51
losses = []
52
for sample in tqdm(train_iter):
53
model.train()
54
optimizer.zero_grad()
55
input_ids = sample['input_ids'].to(args.device)
56
attention_mask = sample['attention_mask'].to(args.device)
57
labels = sample['emotions']
58
outputs = model(input_ids, attention_mask, labels=labels)
59
60
loss = outputs[0]
61
losses.append(loss.item())
62
loss.backward()
63
64
nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
65
optimizer.step()
66
scheduler.step()
67
# 一个Epoch训练完毕,输出train_loss
68
print('Epoch: {0} Average Train Loss: {1:>5.6}'.format(epoch + 1, np.mean(losses)))
69
eval_model(args, model, val_iter)
70
# 训练结束
71
72
73
def eval_model(args, model, val_iter):
74
with torch.no_grad():
75
model.eval()
76
test_loss = []
77
for sample in val_iter:
78
input_ids = sample['input_ids'].to(args.device)
79
attention_mask = sample['attention_mask'].to(args.device)
80
labels = sample['emotions']
81
outputs = model(input_ids, attention_mask, labels=labels)
82
83
test_loss.append(outputs[0].item())
84
print('Average Val Loss: {0:>5.6}'.format(np.mean(test_loss)))
85
86
87
def predict(args, model, test_iter):
88
def f(a):
89
if a > 0.1:
90
return a
91
return 0
92
93
model.eval()
94
test_pred = []
95
for sample in tqdm(test_iter):
96
input_ids = sample['input_ids'].to(args.device)
97
attention_mask = sample['attention_mask'].to(args.device)
98
with torch.no_grad():
99
outputs = model(input_ids, attention_mask)
100
test_pred.extend(outputs[1].sigmoid().cpu().numpy())
101
102
submission = pd.read_csv(args.path + "submit_example.tsv", sep='\t')
103
sub = submission.copy()
104
sub["emotion"] = test_pred
105
sub["emotion"] = sub["emotion"].apply(lambda x: ','.join([str(i) for i in x]))
106
107
sub.to_csv(args.path + "submission.tsv", sep='\t', index=False)
108
109