File size: 2,789 Bytes
c59cf35
9b3af2e
c59cf35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification

# import torch
# import torch.nn.functional as F

# model_name = "andyqin18/test-finetuned"

# model = AutoModelForSequenceClassification.from_pretrained(model_name)
# tokenizer = AutoTokenizer.from_pretrained(model_name)

# classifier = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)

# res = classifier(["Fuck your mom", 
#            "Hope you don't hate it"])

# for result in res:
#     print(result)
import pandas as pd
from sklearn.model_selection import train_test_split
import torch
from torch.utils.data import Dataset
from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer
device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')
import numpy as np

df = pd.read_csv("comp/train.csv")

train_texts = df["comment_text"].values
train_labels = df[df.columns[2:]].values
# print(train_labels[0])

# np.random.seed(123)
# small_train_texts = np.random.choice(train_texts, size=1000, replace=False)
# small_train_labels_idx = np.random.choice(train_labels.shape[0], size=1000, replace=False)
# small_train_labels = train_labels[small_train_labels_idx, :]


# train_texts, val_texts, train_labels, val_labels = train_test_split(small_train_texts, small_train_labels, test_size=.2)
train_texts, val_texts, train_labels, val_labels = train_test_split(train_texts, train_labels, test_size=.2)

class TextDataset(Dataset):
  def __init__(self,texts,labels):
    self.texts = texts
    self.labels = labels

  def __getitem__(self,idx):
    encodings = tokenizer(self.texts[idx], truncation=True, padding="max_length")
    item = {key: torch.tensor(val) for key, val in encodings.items()}
    item['labels'] = torch.tensor(self.labels[idx],dtype=torch.float32)
    del encodings
    return item

  def __len__(self):
    return len(self.labels)

tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
train_dataset = TextDataset(train_texts,train_labels)
val_dataset = TextDataset(val_texts, val_labels)
# small_train_dataset = train_dataset.shuffle(seed=42).select(range(1000))
# small_val_dataset = val_dataset.shuffle(seed=42).select(range(1000))



model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=6,  problem_type="multi_label_classification")
model.to(device)
training_args = TrainingArguments(
    output_dir="finetuned-bert-uncased", 
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    learning_rate=5e-4,
    weight_decay=0.01,
    evaluation_strategy="epoch", 
    push_to_hub=True)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

trainer.train()