forge/ethyr/torch/utils.py (54 lines of code) (raw):

import numpy as np import torch from torch import nn from torch.autograd import Variable #Print model size def modelSize(net): params = 0 for e in net.parameters(): params += np.prod(e.size()) params = int(params/1000) print("Network has ", params, "K params") #Same padded (odd k) def Conv2d(fIn, fOut, k, stride=1): pad = int((k-1)/2) return torch.nn.Conv2d(fIn, fOut, k, stride=stride, padding=pad) def Pool(k, stride=1, pad=0): #pad = int((k-1)/2) return torch.nn.MaxPool2d(k, stride=stride, padding=pad) def Relu(): return torch.nn.ReLU() class FCRelu(nn.Module): def __init__(self, xdim, ydim): super().__init__() self.fc = torch.nn.Linear(xdim, ydim) self.relu = Relu() def forward(self, x): x = self.fc(x) x = self.relu(x) return x class ConvReluPool(nn.Module): def __init__(self, fIn, fOut, k, stride=1, pool=2): super().__init__() self.conv = Conv2d(fIn, fOut, k, stride) self.relu = Relu() self.pool = Pool(k) def forward(self, x): x = self.conv(x) x = self.relu(x) x = self.pool(x) return x #ModuleList wrapper def moduleList(module, *args, n=1): return nn.ModuleList([module(*args) for i in range(n)]) #Variable wrapper def var(xNp, volatile=False, cuda=False): x = Variable(torch.from_numpy(xNp), volatile=volatile).float() if cuda: x = x.cuda() return x #Full-network initialization wrapper def initWeights(net, scheme='orthogonal'): print('Initializing weights. Warning: may overwrite sensitive bias parameters (e.g. batchnorm)') for e in net.parameters(): if scheme == 'orthogonal': if len(e.size()) >= 2: init.orthogonal(e) elif scheme == 'normal': init.normal(e, std=1e-2) elif scheme == 'xavier': init.xavier_normal(e)