Solshine commited on
Commit
0346b62
·
1 Parent(s): c50d0ae

Upload FinetuneModelTrainerForRunningInSpaces.py

Browse files
FinetuneModelTrainerForRunningInSpaces.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import transformers
3
+ import random
4
+
5
+ # Define the model configuration and tokenizer
6
+ config = transformers.AutoConfig.from_pretrained("bert-base-uncased")
7
+ tokenizer = transformers.AutoTokenizer.from_pretrained("bert-base-uncased")
8
+
9
+ # Load the pretrained model
10
+ model = transformers.AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", config=config)
11
+
12
+ # Set the hyperparameters for fine-tuning
13
+ num_epochs = 3
14
+ batch_size = 32
15
+ learning_rate = 2e-5
16
+
17
+ # Create the model optimizer
18
+ optimizer = transformers.AdamW(model.parameters(), lr=learning_rate)
19
+
20
+ # Define the data collator
21
+ def collate_fn(data):
22
+ input_ids = torch.tensor([tokenizer(text, padding="max_length", truncation=True)["input_ids"] for text in data["text"]])
23
+ attention_mask = torch.tensor([tokenizer(text, padding="max_length", truncation=True)["attention_mask"] for text in data["text"]])
24
+ labels = torch.tensor(data["label"])
25
+ return {"input_ids": input_ids, "attention_mask": attention_mask, "labels": labels}
26
+
27
+ # Split the training data into training and validation sets
28
+ def split_data(data, validation_size=0.2):
29
+ validation_indices = random.sample(range(len(data)), int(len(data) * validation_size))
30
+ train_data = []
31
+ val_data = []
32
+ for i, item in enumerate(data):
33
+ if i in validation_indices:
34
+ val_data.append(item)
35
+ else:
36
+ train_data.append(item)
37
+ return train_data, val_data
38
+
39
+ # Split the training data
40
+ train_data, val_data = split_data(train_data, validation_size=0.2)
41
+
42
+ # Finetune the model
43
+ for epoch in range(num_epochs):
44
+ # Create the training data loader
45
+ train_loader = transformers.DataLoader(train_data, batch_size=batch_size, shuffle=True, collate_fn=collate_fn)
46
+
47
+ # Train the model for one epoch
48
+ model.train()
49
+ for batch in train_loader:
50
+ optimizer.zero_grad()
51
+ outputs = model(**batch)
52
+ loss = outputs.loss
53
+ loss.backward()
54
+ optimizer.step()
55
+
56
+
57
+ # Evaluate the model on the validation dataset
58
+ model.eval()
59
+ with torch.no_grad():
60
+ val_loss = 0.0
61
+ for batch in val_loader:
62
+ outputs = model(**batch)
63
+ val_loss += outputs.loss.item()
64
+
65
+ print("Epoch {}: Train Loss: {:.4f} Val Loss: {:.4f}".format(epoch + 1, train_loss / len(train_loader), val_loss / len(val_loader)))
66
+
67
+ # Save the fine-tuned model
68
+ model.save_pretrained("finetuned_model")