AlphaZero / save_games.py
amanmoon's picture
Upload 52 files
afab5da verified
Raw
History Blame Contribute Delete
2.49 kB
import os
import shelve
import torch
from tqdm import trange
from Alpha_Zero_Parallel import Alpha_Zero
from Games.ConnectFour.ConnectFour import ConnectFour
from Games.ConnectFour.ConnectFourNN import ResNet
class Colors:
RESET = "\033[0m"
RED = "\033[91m"
GREEN = "\033[92m"
YELLOW = "\033[93m"
BLUE = "\033[94m"
MAGENTA = "\033[95m"
CYAN = "\033[96m"
WHITE = "\033[97m"
def save_games(args, game, model, optimizer):
try:
model_path = os.path.join(args["MODEL_PATH"], 'model.pt')
optimizer_path = os.path.join(args["MODEL_PATH"], 'optimizer.pt')
model.load_state_dict(torch.load(model_path))
optimizer.load_state_dict(torch.load(optimizer_path))
except:
print(Colors.RED + "UNABLE TO LOAD MODEL")
print(Colors.GREEN + "SETTING UP NEW MODEL..." + Colors.RESET)
else:
print(Colors.GREEN + "MODEL FOUND\nLOADING MODEL..." + Colors.RESET)
finally:
for iteration in range(args["NO_ITERATIONS"]):
memory = []
print(Colors.BLUE + "\nIteration no: " , iteration + 1, Colors.RESET)
print(Colors.YELLOW + "Self Play" + Colors.RESET)
model.eval()
alpha_zero = Alpha_Zero(game, args, model, optimizer)
for _ in trange(args["SELF_PLAY_ITERATIONS"] // args["PARALLEL_PROCESS"]):
memory = alpha_zero.self_play()
with shelve.open( os.path.join(args["SAVE_GAME_PATH"],"games_5.pkl"), writeback=True) as db:
if "data" in db:
existing_data = db["data"]
existing_data.extend(memory)
else:
db["data"] = memory
GAME = "ConnectFour"
args = {
"MODEL_PATH" : os.path.join(os.getcwd(), "Games", GAME, "models_n_optimizers"),
"SAVE_GAME_PATH" : os.path.join(os.getcwd(), "Games", GAME, "games"),
"EXPLORATION_CONSTANT" : 2.25,
"TEMPERATURE" : 1.75,
"DIRICHLET_EPSILON" : 0.25,
"DIRICHLET_ALPHA" : 0.3,
"ROOT_RANDOMNESS": True,
"ADVERSARIAL" : True,
"NO_OF_SEARCHES" : 12000,
"NO_ITERATIONS" : 100,
"SELF_PLAY_ITERATIONS" : 100,
"PARALLEL_PROCESS" : 50,
}
game = ConnectFour()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device, "in use")
model = ResNet(game, 9, 128, device)
model.eval()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay = 0.0001)
save_games(args, game, model, optimizer)