jsuarez/tools/TestGA.py (58 lines of code) (raw):

import torch from torch import nn from torch.autograd import Variable from copy import deepcopy import numpy as np from pdb import set_trace as T def var(xNp, volatile=False, cuda=False): x = Variable(torch.from_numpy(xNp), volatile=volatile).float() if cuda: x = x.cuda() return x class StimNet(nn.Module): def __init__(self, xdim, h, ydim): super().__init__() self.fc1 = torch.nn.Linear(xdim, h) self.fc2 = torch.nn.Linear(h, ydim) def forward(self, x): a = self.fc1(x) a = torch.nn.functional.relu(a) a = self.fc2(a) return a def randomMutation(ann, sigma): annNew = deepcopy(ann) for e in annNew.parameters(): e.data = e.data + torch.Tensor(sigma*np.random.randn(*e.size())) return annNew def GA(fitness, generations, n, t, sigma, dims): P, F = [], [] for g in range(generations): Pn, Fn = [], [] for i in range(n): if g == 0: P.append(StimNet(*dims)) F.append(fitness(P[-1])) elif i == 0: Pn.append(P[0]) Fn.append(F[0]) else: k = np.random.randint(0, t) Pn.append(randomMutation(P[k], sigma)) Fn.append(fitness(Pn[-1])) #Sort dec by F if g > 0: inds = np.argsort(Fn)[::-1] F = np.asarray(Fn)[inds].tolist() P = np.asarray(Pn)[inds].tolist() print(F[0]) if __name__ == '__main__': generations = 100 n = 1000 t = 10 sigma = 0.01 dims = (847, 16, 6) def fitness(ann): inp = var(np.random.randn(dims[0])) out = ann(inp) loss = -torch.sum((1 - out)**2) return loss.data[0] ret = GA(fitness, generations, n, t, sigma, dims)