Skip to content

Commit a6c162b

Browse files
committed
Add generic file for NNet
1 parent 5156c7f commit a6c162b

2 files changed

Lines changed: 80 additions & 0 deletions

File tree

pytorch/__init__.py

Whitespace-only changes.

pytorch/models.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import numpy
2+
import torch
3+
import torch.nn as nn
4+
import torch.nn.functional as F
5+
6+
7+
class Model(nn.Module):
8+
def __init__(self, game, args, layers: int = 4):
9+
# game params
10+
self.board_x, self.board_y = game.getBoardSize()
11+
self.action_size = game.getActionSize()
12+
self.args = args
13+
14+
# nnet params
15+
self.layers = layers
16+
self.conv = []
17+
self.batchnorm = []
18+
self.fc = []
19+
self.fcbn = []
20+
21+
super(Model, self).__init__()
22+
23+
self._setup()
24+
25+
def _setup(self):
26+
# Create Conv layers
27+
in_channels = 1
28+
kernel_size = int(float(min(self.board_x, self.board_y)) / self.layers)
29+
# if kernel_size < 3:
30+
kernel_size = 3
31+
paddings = [1, 1, 0, 0]
32+
for i in range(self.layers):
33+
conv = nn.Conv2d(in_channels, self.args.num_channels, kernel_size, stride=1, padding=paddings[i])
34+
self.add_module(f'conv{i}', conv)
35+
self.conv.append(conv)
36+
in_channels = self.args.num_channels
37+
38+
# Prepare Batch Normalization
39+
for i in range(self.layers):
40+
bn = nn.BatchNorm2d(self.args.num_channels)
41+
self.batchnorm.append(bn)
42+
self.add_module(f'batchnorm{i}', bn)
43+
44+
# Prepare features
45+
in_features = self.args.num_channels * (self.board_x - self.layers) * (self.board_y - self.layers)
46+
# self.fc1 = nn.Linear(self.args.num_channels * (self.board_x-4)*(self.board_y-4), 1024)
47+
48+
out_features = 0
49+
for i in range(self.layers - 2):
50+
out_features = (self.args.feature_multiplier * (self.layers - 2 - i))
51+
linear = nn.Linear(in_features, out_features)
52+
self.fc.append(linear)
53+
self.add_module(f'fc{i}', linear)
54+
bn = nn.BatchNorm1d(out_features)
55+
self.fcbn.append(bn)
56+
self.add_module(f'batchnorm1d{i}', bn)
57+
in_features = out_features
58+
59+
self.fc_pi = nn.Linear(out_features, self.action_size)
60+
self.fc_v = nn.Linear(out_features, 1)
61+
62+
def forward(self, s: torch.Tensor):
63+
s = s.view(-1, 1, self.board_x, self.board_y)
64+
65+
for i in range(self.layers):
66+
s = F.relu(self.batchnorm[i](self.conv[i](s)))
67+
68+
size = int(numpy.prod(list(s.size())))
69+
s = s.view(-1, size)
70+
71+
fs = self.fc[0](s)
72+
bs = self.fcbn[0](fs)
73+
tensor = F.relu(bs)
74+
s = F.dropout(tensor, p=self.args.dropout, training=self.training)
75+
s = F.dropout(F.relu(self.fcbn[1](self.fc[1](s))), p=self.args.dropout, training=self.training)
76+
77+
pi = self.fc_pi(s)
78+
v = self.fc_v(s)
79+
80+
return F.log_softmax(pi, dim=1), torch.tanh(v)

0 commit comments

Comments
 (0)