Br-T-3-pre / Br-T-3.pre.py
Bertug1911's picture
Upload 3 files
7dcee53 verified
import sentencepiece as spm
import tensorflow as tf
import numpy as np
import os
import sys
class BrT3Model:
def __init__(self, vocab_size=372, embedding_dim=1024, model_prefix="sentencepiece", max_seq_len=100, model_name="Br-T-3-preview-low"):
self.vocab_size = vocab_size
self.embedding_dim = embedding_dim
self.model_prefix = model_prefix
self.model_file = f"{self.model_prefix}.model"
self.max_seq_len = max_seq_len
self.model_name = model_name
self.model_path = f"model_{self.model_name}.weights.h5"
self.sp = None
self.embedding_layer = tf.keras.layers.Embedding(input_dim=self.vocab_size, output_dim=self.embedding_dim, mask_zero=True)
# 50 LSTM katmanı (512000 nöron eşit dağıtıldı)
self.lstm_layers = [tf.keras.layers.LSTM(10240, return_sequences=True) for _ in range(1)]#-------------------------------------------------
# 30 GRU katmanı (256000 nöron eşit dağıtıldı)
self.gru_layers = [tf.keras.layers.GRU(8533, return_sequences=True) for _ in range(1)]#------------------------------------------------------------
# 16 Transformer bloğu (Her blok 5 FF, her FF 512 nöron, toplam 50000 nöron)
self.transformer_blocks = [
tf.keras.layers.Dense(512, activation="relu") for _ in range(3 * 5)
]
self.output_layer = tf.keras.layers.Dense(vocab_size, activation='softmax')
self.classifier = tf.keras.layers.Dense(1, activation='sigmoid') # Soru/Cümle sınıflandırıcı
self.model = None
def train_tokenizer(self, data_file):
print(f"🚀 '{data_file}' dosyası ile SentencePiece eğitimi başlıyor...")
spm.SentencePieceTrainer.train(input=data_file, model_prefix=self.model_prefix, vocab_size=self.vocab_size, model_type="word")
self.sp = spm.SentencePieceProcessor()
self.sp.load(self.model_file)
print(f"✅ Tokenizer eğitildi! VOCAB SIZE: {self.vocab_size}")
def create_model(self):
inputs = tf.keras.Input(shape=(None,))
embedded = self.embedding_layer(inputs)
x = embedded
# LSTM katmanlarını ekleyelim
for lstm in self.lstm_layers:
x = lstm(x)
# GRU katmanlarını ekleyelim
for gru in self.gru_layers:
x = gru(x)
# Transformer bloklarını ekleyelim
for transformer in self.transformer_blocks:
x = transformer(x)
outputs = self.output_layer(x)
classifier_output = self.classifier(x[:, -1, :]) # Soru mu cümle mi tespiti
self.model = tf.keras.Model(inputs, [outputs, classifier_output])
self.model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=[tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), tf.keras.losses.BinaryCrossentropy()],
loss_weights=[0.8, 0.2])
print(f"✅ Model oluşturuldu! Ağırlık dosyası: {self.model_path}")
def train(self, dataset, epochs=1000):
if not self.model:
self.create_model()
for epoch in range(epochs):
for batch, (inp, tar, is_question) in enumerate(dataset):
loss_values = self.model.train_on_batch(inp, [tar, is_question])
loss_main = float(loss_values[0])
loss_classifier = float(loss_values[1])
print(f"🔹 Batch {batch+1}: Loss (Main): {loss_main:.4f}, Loss (Classifier): {loss_classifier:.4f}")
if loss_main < 5:
print(f"✅ Eğitim durduruldu! Batch {batch+1} içinde loss 0.5'in altına düştü.")
self.model.save_weights(self.model_path)
print(f"✅ Model ağırlıkları kaydedildi: {self.model_path}")
return
self.model.save_weights(self.model_path)
print(f"🎯 Model eğitimi tamamlandı ve ağırlıklar kaydedildi: {self.model_path}")
def load_model(self):
if os.path.exists(self.model_path):
print(f"✅ Kaydedilmiş model bulundu! Ağırlıklar yükleniyor: {self.model_path}")
self.create_model()
self.model.load_weights(self.model_path)
else:
print("❌ Model ağırlıkları bulunamadı! Modeli eğitmeniz gerekiyor.")
def predict(self, input_text):
if not self.sp:
self.sp = spm.SentencePieceProcessor()
self.sp.load(self.model_file)
if not self.model:
self.load_model()
# Dil etiketini belirle
lang = "TR" # Varsayılan Türkçe
if "| L: EN" in input_text:
lang = "EN"
elif "| L: D" in input_text:
lang = "D"
clean_text = input_text.split("| L:")[0].strip() # Dil etiketini kaldır
tokenized_input = self.sp.encode(clean_text)
tokenized_input = np.array(tokenized_input).reshape(1, -1)
predictions, is_question = self.model.predict(tokenized_input)
is_question = (is_question[0][0] > 0.5) # Eğer 0.5'ten büyükse soru olarak kabul et
if is_question:
print("🟢 Soru algılandı, soru-cevap modunda çalışılıyor...")
else:
print("🔵 Cümle tamamlanıyor...")
predicted_token_id = int(np.argmax(predictions[0][-1]))
predicted_word = self.sp.decode([predicted_token_id])
print(f"🔮 Tahmin edilen yanıt: {predicted_word} ({'Soru' if is_question else 'Cümle'}) - {lang}")
return predicted_word
# MODE ayarlaması: 't' -> train, 'u' -> use
MODE = 't' # Eğitim için 't', kullanım için 'u' ayarla
brt3 = BrT3Model()
if MODE == 't':
brt3.train_tokenizer("C:\\Users\\bertu\\OneDrive\\Desktop\\1000_Cumle.txt")
brt3.train_tokenizer("C:\\Users\\bertu\\Downloads\\qa_dataset.txt")
data = [(np.random.randint(0, 372, (10,)), np.random.randint(0, 372, (10,)), np.random.randint(0, 2, (1,))) for _ in range(100)]
dataset = tf.data.Dataset.from_generator(lambda: data, output_signature=(
tf.TensorSpec(shape=(10,), dtype=tf.int32),
tf.TensorSpec(shape=(10,), dtype=tf.int32),
tf.TensorSpec(shape=(1,), dtype=tf.float32)
)).batch(8)
brt3.train(dataset)
elif MODE == 'u':
brt3.load_model()
test_sentence = "Bana bir şiir yaz | L: TR"
brt3.predict(test_sentence)