← back to Handbag Authentication

handbag_data/github_datasets/iGAN/lib/inits.py

110 lines

import numpy as np


from .theano_utils import sharedX
from .rng import np_rng


class Uniform(object):
    def __init__(self, scale=0.05):
        self.scale = 0.05

    def __call__(self, shape, name=None):
        return sharedX(np_rng.uniform(low=-self.scale, high=self.scale, size=shape), name=name)


class Normal(object):
    def __init__(self, loc=0., scale=0.05):
        self.scale = scale
        self.loc = loc

    def __call__(self, shape, name=None):
        return sharedX(np_rng.normal(loc=self.loc, scale=self.scale, size=shape), name=name)


class Orthogonal(object):
    """ benanne lasagne ortho init (faster than qr approach)"""

    def __init__(self, scale=1.1):
        self.scale = scale

    def __call__(self, shape, name=None):
        print('called orthogonal init with shape', shape)
        flat_shape = (shape[0], np.prod(shape[1:]))
        a = np_rng.normal(0.0, 1.0, flat_shape)
        u, _, v = np.linalg.svd(a, full_matrices=False)
        q = u if u.shape == flat_shape else v  # pick the one with the correct shape
        q = q.reshape(shape)
        return sharedX(self.scale * q[:shape[0], :shape[1]], name=name)


class Frob(object):

    def __init__(self):
        pass

    def __call__(self, shape, name=None):
        r = np_rng.normal(loc=0, scale=0.01, size=shape)
        r = r / np.sqrt(np.sum(r**2)) * np.sqrt(shape[1])
        return sharedX(r, name=name)


class Constant(object):

    def __init__(self, c=0.):
        self.c = c

    def __call__(self, shape, name=None):
        return sharedX(np.ones(shape) * self.c, name=name)


class ConvIdentity(object):

    def __init__(self, scale=1.):
        self.scale = scale

    def __call__(self, shape, name=None):
        w = np.zeros(shape)
        ycenter = shape[2] // 2
        xcenter = shape[3] // 2

        if shape[0] == shape[1]:
            o_idxs = np.arange(shape[0])
            i_idxs = np.arange(shape[1])
        elif shape[1] < shape[0]:
            o_idxs = np.arange(shape[0])
            i_idxs = np.random.permutation(np.tile(np.arange(shape[1]), shape[0] / shape[1] + 1))[:shape[0]]
        w[o_idxs, i_idxs, ycenter, xcenter] = self.scale
        return sharedX(w, name=name)


class Identity(object):

    def __init__(self, scale=0.25):
        self.scale = scale

    def __call__(self, shape, name=None):
        if shape[0] != shape[1]:
            w = np.zeros(shape)
            o_idxs = np.arange(shape[0])
            i_idxs = np.random.permutation(np.tile(np.arange(shape[1]), shape[0] / shape[1] + 1))[:shape[0]]
            w[o_idxs, i_idxs] = self.scale
        else:
            w = np.identity(shape[0]) * self.scale
        return sharedX(w, name=name)


class ReluInit(object):

    def __init__(self):
        pass

    def __call__(self, shape, name=None):
        if len(shape) == 2:
            scale = np.sqrt(2. / shape[0])
        elif len(shape) == 4:
            scale = np.sqrt(2. / np.prod(shape[1:]))
        else:
            raise NotImplementedError
        return sharedX(np_rng.normal(size=shape, scale=scale), name=name)