Upload 2 files
Browse files- BrT-cot-t2t-mini.py +150 -0
- BrT-t2t_turkish_conversation_complete_100.csv +21 -0
BrT-cot-t2t-mini.py
ADDED
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import torch
|
2 |
+
import torch.nn as nn
|
3 |
+
import torch.optim as optim
|
4 |
+
from torch.utils.data import Dataset, DataLoader
|
5 |
+
import pandas as pd
|
6 |
+
from transformers import AutoTokenizer
|
7 |
+
import torch.nn.functional as F
|
8 |
+
import random
|
9 |
+
|
10 |
+
# Tokenizer'ı değiştirme - Türkçe için optimize edilmiş
|
11 |
+
TOKENIZER_NAME = "dbmdz/bert-base-turkish-cased"
|
12 |
+
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_NAME)
|
13 |
+
|
14 |
+
# Veri setini yükleme
|
15 |
+
dataset_path = "C:\\Users\\bertu\\Downloads\\BrT-t2t_turkish_conversation_complete_100.csv"
|
16 |
+
df = pd.read_csv(dataset_path)
|
17 |
+
|
18 |
+
# Özel Dataset sınıfı
|
19 |
+
class ChatDataset(Dataset):
|
20 |
+
def __init__(self, dataframe, tokenizer, max_length=256):
|
21 |
+
self.inputs = dataframe['Input'].tolist()
|
22 |
+
self.cots = dataframe['CoT'].tolist()
|
23 |
+
self.outputs = dataframe['Output'].tolist()
|
24 |
+
self.tokenizer = tokenizer
|
25 |
+
self.max_length = max_length
|
26 |
+
|
27 |
+
def __len__(self):
|
28 |
+
return len(self.inputs)
|
29 |
+
|
30 |
+
def __getitem__(self, idx):
|
31 |
+
input_text = self.inputs[idx]
|
32 |
+
cot_text = self.cots[idx]
|
33 |
+
output_text = self.outputs[idx]
|
34 |
+
|
35 |
+
input_encoding = self.tokenizer(input_text, max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt')
|
36 |
+
cot_encoding = self.tokenizer(cot_text, max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt')
|
37 |
+
output_encoding = self.tokenizer(output_text, max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt')
|
38 |
+
|
39 |
+
return {
|
40 |
+
'input_ids': input_encoding['input_ids'].squeeze(),
|
41 |
+
'attention_mask': input_encoding['attention_mask'].squeeze(),
|
42 |
+
'cot_ids': cot_encoding['input_ids'].squeeze(),
|
43 |
+
'labels': output_encoding['input_ids'].squeeze()
|
44 |
+
}
|
45 |
+
|
46 |
+
# Transformer Modeli
|
47 |
+
class CustomTransformer(nn.Module):
|
48 |
+
def __init__(self, vocab_size, embed_dim=512, num_heads=8, ff_dim=1024, num_layers=6):
|
49 |
+
super(CustomTransformer, self).__init__()
|
50 |
+
|
51 |
+
self.embedding = nn.Embedding(vocab_size, embed_dim)
|
52 |
+
self.encoder_layer = nn.TransformerEncoderLayer(d_model=embed_dim, nhead=num_heads, dim_feedforward=ff_dim)
|
53 |
+
self.transformer = nn.TransformerEncoder(self.encoder_layer, num_layers=num_layers)
|
54 |
+
self.fc = nn.Linear(embed_dim, vocab_size)
|
55 |
+
|
56 |
+
def forward(self, input_ids, attention_mask):
|
57 |
+
x = self.embedding(input_ids)
|
58 |
+
x = self.transformer(x)
|
59 |
+
x = self.fc(x)
|
60 |
+
return x
|
61 |
+
|
62 |
+
# Modeli oluşturma ve eğitme
|
63 |
+
def train_model(train_loader, model, optimizer, criterion, device, epochs=30):
|
64 |
+
model.to(device)
|
65 |
+
model.train()
|
66 |
+
|
67 |
+
for epoch in range(epochs):
|
68 |
+
total_loss = 0
|
69 |
+
print(f"Epoch {epoch+1} başlıyor...")
|
70 |
+
for batch in train_loader:
|
71 |
+
input_ids = batch['input_ids'].to(device)
|
72 |
+
attention_mask = batch['attention_mask'].to(device)
|
73 |
+
labels = batch['labels'].to(device)
|
74 |
+
|
75 |
+
optimizer.zero_grad()
|
76 |
+
outputs = model(input_ids, attention_mask)
|
77 |
+
loss = criterion(outputs.transpose(1, 2), labels) # Loss fonksiyonunu düzelttik
|
78 |
+
loss.backward()
|
79 |
+
optimizer.step()
|
80 |
+
|
81 |
+
total_loss += loss.item()
|
82 |
+
print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader)}")
|
83 |
+
|
84 |
+
torch.save(model.state_dict(), "trained_transformer.pth")
|
85 |
+
print("Model başarıyla kaydedildi!")
|
86 |
+
return model
|
87 |
+
|
88 |
+
# Modeli yükleme fonksiyonu
|
89 |
+
def load_model(model, device):
|
90 |
+
model.load_state_dict(torch.load("trained_transformer.pth", map_location=device))
|
91 |
+
model.to(device)
|
92 |
+
model.eval()
|
93 |
+
print("Model başarıyla yüklendi!")
|
94 |
+
return model
|
95 |
+
|
96 |
+
# Nucleus Sampling (Top-p) ile Yanıt Üretme Fonksiyonu
|
97 |
+
def nucleus_sampling(logits, p=0.9):
|
98 |
+
logits = logits.squeeze(0) # Çok boyutlu tensorü düzleştir
|
99 |
+
sorted_logits, sorted_indices = torch.sort(logits, descending=True)
|
100 |
+
cumulative_probs = torch.cumsum(F.softmax(sorted_logits, dim=-1), dim=-1)
|
101 |
+
|
102 |
+
sorted_indices_to_remove = cumulative_probs > p
|
103 |
+
sorted_indices_to_remove[:, 1:] = sorted_indices_to_remove[:, :-1].clone()
|
104 |
+
sorted_indices_to_remove[:, 0] = False
|
105 |
+
|
106 |
+
logits[sorted_indices_to_remove] = -float("Inf")
|
107 |
+
probabilities = F.softmax(logits, dim=-1)
|
108 |
+
|
109 |
+
return torch.multinomial(probabilities, num_samples=1).squeeze()
|
110 |
+
|
111 |
+
# Yanıt Üretme Fonksiyonu
|
112 |
+
def generate_response(model, tokenizer, input_text, device, max_length=256):
|
113 |
+
model.eval()
|
114 |
+
with torch.no_grad():
|
115 |
+
input_encoding = tokenizer(input_text, max_length=max_length, padding='max_length', truncation=True, return_tensors='pt').to(device)
|
116 |
+
input_ids = input_encoding['input_ids']
|
117 |
+
attention_mask = input_encoding['attention_mask']
|
118 |
+
|
119 |
+
cot_output = model(input_ids, attention_mask)
|
120 |
+
cot_ids = nucleus_sampling(cot_output, p=0.9).view(-1)
|
121 |
+
cot_text = tokenizer.decode(cot_ids.tolist(), skip_special_tokens=True)
|
122 |
+
|
123 |
+
output = model(input_ids, attention_mask)
|
124 |
+
output_ids = nucleus_sampling(output, p=0.9).view(-1)
|
125 |
+
output_text = tokenizer.decode(output_ids.tolist(), skip_special_tokens=True)
|
126 |
+
|
127 |
+
print(f"CoT Çıktısı: {cot_text}")
|
128 |
+
print(f"Model Yanıtı: {output_text}")
|
129 |
+
print("Yanıt üretme tamamlandı!")
|
130 |
+
|
131 |
+
return cot_text, output_text
|
132 |
+
|
133 |
+
# Model eğitme ve test etme
|
134 |
+
if __name__ == "__main__":
|
135 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
136 |
+
dataset = ChatDataset(df, tokenizer)
|
137 |
+
train_loader = DataLoader(dataset, batch_size=8, shuffle=True)
|
138 |
+
|
139 |
+
model = CustomTransformer(vocab_size=len(tokenizer), embed_dim=512)
|
140 |
+
optimizer = optim.Adam(model.parameters(), lr=0.0005)
|
141 |
+
criterion = nn.CrossEntropyLoss()
|
142 |
+
|
143 |
+
model = train_model(train_loader, model, optimizer, criterion, device)
|
144 |
+
model = load_model(model, device)
|
145 |
+
|
146 |
+
while True:
|
147 |
+
user_input = input("Kullanıcı: ")
|
148 |
+
if user_input.lower() == "çıkış":
|
149 |
+
break
|
150 |
+
generate_response(model, tokenizer, user_input, device)
|
BrT-t2t_turkish_conversation_complete_100.csv
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Input,CoT,Output
|
2 |
+
Merhaba! Bugün nasıl gidiyor?,"Kullanıcı bana gününün nasıl geçtiğini sordu, ona ilgisini çekebilecek bir şekilde yanıt vermeliyim.","Güzel gidiyor! Bugün biraz kitap okudum, senin günün nasıl geçti?"
|
3 |
+
"Bugün hava çok sıcaktı, biraz bunaldım.","Kullanıcı havanın sıcak olduğunu belirtti, ona sohbeti devam ettirecek bir yanıt vermeliyim.","Evet, bugün gerçekten sıcak! Serinlemek için soğuk bir içecek almayı düşündün mü?"
|
4 |
+
Yeni bir hobi edinmek istiyorum ama ne yapacağımı bilmiyorum.,"Kullanıcı yeni bir aktivite bulmak istiyor, ona çeşitli öneriler sunmalıyım.",Belki resim çizmeyi veya bir enstrüman çalmayı deneyebilirsin! Neler ilgini çekiyor?
|
5 |
+
"Hafta sonu bir yerlere gitmeyi planlıyorum, önerin var mı?","Kullanıcı seyahat hakkında öneri istiyor, ona ilginç destinasyonlar sunmalıyım.",Doğa ile iç içe bir yer mi arıyorsun yoksa şehir turu mu yapmak istersin?
|
6 |
+
Bugün kahve içmeden uyanamadım!,"Kullanıcı kahve içmeden enerjik hissedemediğini belirtti, ona bu konuda sohbet başlatmalıyım.",Kahve gerçekten sabahları harika oluyor! En sevdiğin kahve türü hangisi?
|
7 |
+
"Son zamanlarda iyi bir kitap okumak istiyorum, önerin var mı?","Kullanıcı kitap tavsiyesi istiyor, ona farklı türlerde öneriler sunmalıyım.",Macera seviyorsan 'Yeraltından Notlar' harika bir seçim olabilir! Hangi tür kitaplardan hoşlanıyorsun?
|
8 |
+
Bugün spora gitmeyi düşündüm ama üşendim.,"Kullanıcı spora gitmek konusunda kararsız, ona motive edici bir yanıt vermeliyim.",Biliyorum bazen zor gelebiliyor ama gittikten sonra çok iyi hissedeceksin!
|
9 |
+
En sevdiğin film nedir?,"Kullanıcı favori filmlerimi öğrenmek istiyor, ona ilginç bir seçim sunmalıyım.",Inception gerçekten akılları karıştıran bir film! Sen hangi filmleri seversin?
|
10 |
+
Yapay zeka sence gelecekte insanları geçer mi?,"Kullanıcı AI'nin geleceği hakkında sohbet açtı, ona dengeli bir yanıt vermeliyim.",Bence AI birçok alanda gelişecek ama insan yaratıcılığı ve duygusallığı hala çok özel!
|
11 |
+
Bu sabah otobüsü kaçırdım ve işe geç kaldım.,"Kullanıcı kötü bir olay yaşadı, ona empati göstermeliyim.",Gerçekten sinir bozucu olabilir! Umarım günün geri kalanı daha iyi geçmiştir.
|
12 |
+
"Bugün yeni bir şarkı keşfettim, paylaşayım mı?","Kullanıcı yeni bir şarkı keşfettiğini belirtti, ona ilgimi göstermeliyim.","Tabii ki! Yeni müzikler keşfetmeyi çok severim, hangi şarkıyı dinledin?"
|
13 |
+
"Teknoloji çok hızlı ilerliyor, sence 50 yıl sonra neler olacak?","Kullanıcı gelecekle ilgili bir konu açtı, ona mantıklı tahminlerde bulunmalıyım.",Bence yapay zeka hayatımızın her alanına entegre olacak ama etik sınırlar önemli olacak!
|
14 |
+
"Bugün güzel bir manzara gördüm, doğa gerçekten harika.","Kullanıcı doğanın güzelliğinden bahsetti, ona doğayla ilgili konuşmalıyım.",Kesinlikle katılıyorum! Doğada vakit geçirmek insanı gerçekten rahatlatıyor.
|
15 |
+
Sence gece mi yoksa gündüz mü daha güzel?,"Kullanıcı gece ve gündüz karşılaştırması yapıyor, ona kişisel fikrimi söylemeliyim.",Bence gece daha huzurlu ama sabahları yeni bir günün enerjisi harika!
|
16 |
+
Çay mı kahve mi daha iyi?,"Kullanıcı çay ve kahve arasında tercih yapmak istiyor, ona düşüncemi söylemeliyim.",Bence kahve sabahları mükemmel ama çay her zaman içilebilir!
|
17 |
+
"Bugün yeni bir tarif denedim, yemek yapmak çok eğlenceli.","Kullanıcı yemek yapmayı sevdiğini belirtti, ona mutfakla ilgili konuşmalıyım.",Süper! Ne yaptın? Tarif paylaşabilir misin?
|
18 |
+
"Spor yapmaya yeni başladım, sence hangi egzersizler daha iyi?","Kullanıcı spora yeni başlamış, ona faydalı öneriler sunmalıyım.",Bence yürüyüş ve hafif kardiyo harika bir başlangıç olur! Sen hangi sporu seviyorsun?
|
19 |
+
Bugün arkadaşlarımla çok eğlenceli vakit geçirdim.,"Kullanıcı arkadaşlarıyla güzel bir gün geçirdiğini belirtti, ona olumlu bir yanıt vermeliyim.",Ne güzel! Arkadaşlarla vakit geçirmek gerçekten moral verici oluyor.
|
20 |
+
Sence şehir hayatı mı yoksa kırsal yaşam mı daha güzel?,"Kullanıcı şehir ve kırsal yaşamı karşılaştırıyor, ona avantajlarını anlatmalıyım.",Şehir hayatı dinamik ama kırsal yaşam daha huzurlu! Sen hangisini tercih edersin?
|
21 |
+
"Uzun bir yolculuğa çıkmayı düşünüyorum, önerin var mı?","Kullanıcı seyahat planı yapmak istiyor, ona öneriler sunmalıyım.",Bence Avrupa turu harika olur! Kültürel geziler mi yoksa doğa gezileri mi daha çok ilgini çekiyor?
|