EvoTransformer-Demo / evo_transformer.py
HemanM's picture
Update evo_transformer.py
69a8269 verified
raw
history blame
2.03 kB
# evo_transformer.py
import random
import json
class EvoTransformer:
def __init__(self, config=None):
self.config = config or {
"layers": 4,
"attention_heads": 4,
"ffn_dim": 1024,
"dropout": 0.1,
"memory": False,
}
self.history = [self.config.copy()]
def mutate(self):
new_config = self.config.copy()
trait = random.choice(list(new_config.keys()))
if trait == "layers":
new_config[trait] = max(1, new_config[trait] + random.choice([-1, 1]))
elif trait == "attention_heads":
new_config[trait] = random.choice([2, 4, 6, 8])
elif trait == "ffn_dim":
new_config[trait] = random.choice([512, 1024, 2048])
elif trait == "dropout":
new_config[trait] = round(min(max(0.0, new_config[trait] + random.uniform(-0.05, 0.05)), 0.5), 2)
elif trait == "memory":
new_config[trait] = not new_config[trait]
self.config = new_config
self.history.append(new_config.copy())
def evolve(self, generations=3):
for _ in range(generations):
self.mutate()
def get_history(self):
return self.history
def evaluate(self):
score = round(random.uniform(0.85, 0.95), 4)
return {"accuracy": score, "params": self.estimate_params()}
def estimate_params(self):
return round(self.config["layers"] * self.config["ffn_dim"] * 0.001, 2)
def save_history(self):
csv_path = "evo_history.csv"
json_path = "evo_history.json"
with open(csv_path, "w") as f:
f.write("generation,layers,attention_heads,ffn_dim,dropout,memory\n")
for i, cfg in enumerate(self.history):
f.write(f"{i+1},{cfg['layers']},{cfg['attention_heads']},{cfg['ffn_dim']},{cfg['dropout']},{cfg['memory']}\n")
with open(json_path, "w") as f:
json.dump(self.history, f, indent=2)
return csv_path, json_path