Implemented Net based AI
This commit is contained in:
parent
afb48a38a1
commit
9350b1e4ba
15 changed files with 68 additions and 11 deletions
BIN
TicTacToe_AI/Net/datasets/MNIST/processed/test.pt
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/processed/test.pt
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/processed/training.pt
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/processed/training.pt
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-images-idx3-ubyte
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-images-idx3-ubyte
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-images-idx3-ubyte.gz
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-images-idx3-ubyte.gz
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-labels-idx1-ubyte
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-labels-idx1-ubyte
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-labels-idx1-ubyte.gz
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/t10k-labels-idx1-ubyte.gz
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-images-idx3-ubyte
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-images-idx3-ubyte
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-images-idx3-ubyte.gz
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-images-idx3-ubyte.gz
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-labels-idx1-ubyte
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-labels-idx1-ubyte
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-labels-idx1-ubyte.gz
Normal file
BIN
TicTacToe_AI/Net/datasets/MNIST/raw/train-labels-idx1-ubyte.gz
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/nets/net_0.pt
Normal file
BIN
TicTacToe_AI/Net/nets/net_0.pt
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/nets/net_1.pt
Normal file
BIN
TicTacToe_AI/Net/nets/net_1.pt
Normal file
Binary file not shown.
BIN
TicTacToe_AI/Net/nets/net_2.pt
Normal file
BIN
TicTacToe_AI/Net/nets/net_2.pt
Normal file
Binary file not shown.
|
|
@ -1,5 +1,8 @@
|
||||||
import random
|
import random
|
||||||
import torch
|
import torch
|
||||||
|
import torch.optim as optim
|
||||||
|
from torch import nn
|
||||||
|
import torch.nn.functional as F
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10,9 +13,11 @@ def to_set(raw_list):
|
||||||
raw_board, raw_label = line.split('|')[0], line.split('|')[1]
|
raw_board, raw_label = line.split('|')[0], line.split('|')[1]
|
||||||
|
|
||||||
# convert string label to tensor
|
# convert string label to tensor
|
||||||
label = torch.zeros([1, 9])
|
label = torch.zeros([1, 1], dtype=torch.long)
|
||||||
if not (int(raw_label) is -1):
|
if not (int(raw_label) is -1):
|
||||||
label[0][int(raw_label)] = 1
|
label[0][0] = int(raw_label)
|
||||||
|
else:
|
||||||
|
label[0][0] = 9
|
||||||
|
|
||||||
# convert board to tensor
|
# convert board to tensor
|
||||||
raw_board = raw_board.split(',')
|
raw_board = raw_board.split(',')
|
||||||
|
|
@ -30,13 +35,65 @@ def to_set(raw_list):
|
||||||
return out_set
|
return out_set
|
||||||
|
|
||||||
|
|
||||||
|
def buildsets():
|
||||||
with open('boards.bds', 'r') as infile:
|
with open('boards.bds', 'r') as infile:
|
||||||
print('Loading file...')
|
print('Loading file...')
|
||||||
alllines = infile.readlines()
|
alllines = infile.readlines()
|
||||||
|
print(len(alllines))
|
||||||
random.shuffle(alllines)
|
random.shuffle(alllines)
|
||||||
|
|
||||||
print('Generating testset...')
|
print('Generating testset...')
|
||||||
testset = to_set(alllines[0:50000])
|
testset = to_set(alllines[0:10000])
|
||||||
|
|
||||||
print('Generating trainset...')
|
print('Generating trainset...')
|
||||||
trainset = to_set(alllines[50001:])
|
trainset = to_set(alllines[10001:200000])
|
||||||
|
|
||||||
|
return trainset, testset
|
||||||
|
|
||||||
|
|
||||||
|
def testnet(net, testset):
|
||||||
|
correct = 0
|
||||||
|
total = 0
|
||||||
|
with torch.no_grad():
|
||||||
|
for X, label in testset:
|
||||||
|
output = net(X)
|
||||||
|
if torch.argmax(output) == label[0]:
|
||||||
|
correct += 1
|
||||||
|
total += 1
|
||||||
|
print("Accuracy: ", round(correct / total, 3))
|
||||||
|
|
||||||
|
|
||||||
|
class Net(torch.nn.Module):
|
||||||
|
def __init__(self):
|
||||||
|
super(Net, self).__init__()
|
||||||
|
self.fc1 = nn.Linear(9, 9)
|
||||||
|
self.fc2 = nn.Linear(9, 20)
|
||||||
|
self.fc3 = nn.Linear(20, 50)
|
||||||
|
self.fc4 = nn.Linear(50, 10)
|
||||||
|
|
||||||
|
def forward(self, x):
|
||||||
|
x = F.relu(self.fc1(x))
|
||||||
|
x = F.relu(self.fc2(x))
|
||||||
|
x = F.relu(self.fc3(x))
|
||||||
|
x = self.fc4(x)
|
||||||
|
return F.log_softmax(x, dim=1)
|
||||||
|
|
||||||
|
|
||||||
|
net = Net()
|
||||||
|
|
||||||
|
optimizer = optim.Adam(net.parameters(), lr=0.001)
|
||||||
|
|
||||||
|
trainset, testset = buildsets()
|
||||||
|
|
||||||
|
for epoch in range(100):
|
||||||
|
print('Epoch: ' + str(epoch))
|
||||||
|
for X, label in tqdm(trainset):
|
||||||
|
net.zero_grad()
|
||||||
|
output = net(X)
|
||||||
|
loss = F.nll_loss(output.view(1, 10), label[0])
|
||||||
|
loss.backward()
|
||||||
|
optimizer.step()
|
||||||
|
|
||||||
|
print(loss)
|
||||||
|
torch.save(net, './nets/net_' + str(epoch) + '.pt')
|
||||||
|
testnet(net, testset)
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ test = datasets.MNIST('./datasets', train=False, download=True,
|
||||||
transforms.ToTensor()
|
transforms.ToTensor()
|
||||||
]))
|
]))
|
||||||
|
|
||||||
trainset = torch.utils.data.DataLoader(train, batch_size=10, shuffle=True)
|
trainset = torch.utils.data.DataLoader(train, batch_size=15, shuffle=True)
|
||||||
testset = torch.utils.data.DataLoader(test, batch_size=10, shuffle=False)
|
testset = torch.utils.data.DataLoader(test, batch_size=10, shuffle=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue