| 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) |
|
|