Beispiel #1
0
    def __init__(self,
                 n_inputs,
                 n_hiddens,
                 act_fun,
                 n_mades,
                 batch_norm=False,
                 input_order='sequential',
                 mode='sequential',
                 input=None,
                 args=None):
        """
        Constructor.
        :param n_inputs: number of inputs
        :param n_hiddens: list with number of hidden units for each hidden layer
        :param act_fun: tensorflow activation function
        :param n_mades: number of mades
        :param batch_norm: whether to use batch normalization between mades
        :param input_order: order of inputs of last made
        :param mode: strategy for assigning degrees to hidden nodes: can be 'random' or 'sequential'
        :param input: tensorflow placeholder to serve as input; if None, a new placeholder is created
        """
        self.args = args
        # save input arguments
        self.n_inputs = n_inputs
        self.n_hiddens = n_hiddens
        self.act_fun = act_fun
        self.n_mades = n_mades
        self.batch_norm = batch_norm
        self.mode = mode

        self.input = input  #eager
        self.training = False  #eager
        self.parms = []

        self.mades = []
        self.bns = []
        self.u = self.input  ## moving to eager need to set self.u not self.input!!!!!
        self.logdet_dudx = 0.0

        ## init mades & BN
        for i in range(n_mades):

            # create a new made
            made = mades.GaussianMade(n_inputs, n_hiddens, act_fun,
                                      input_order, mode)
            self.mades.append(made)
            self.parms += made.parms

            input_order = 'random'

            # batch normalization
            if batch_norm:
                bn = BatchNormalization(self.args)
                self.parms += [bn.loggamma, bn.beta]
                self.bns.append(bn)

        self.input_order = self.mades[0].input_order
        self.parms = flatten(self.parms)
Beispiel #2
0
    def __init__(self,
                 n_inputs,
                 n_hiddens,
                 act_fun,
                 n_mades,
                 batch_norm=False,
                 input_order='sequential',
                 mode='sequential',
                 input=None):
        """
        Constructor.
        :param n_inputs: number of inputs
        :param n_hiddens: list with number of hidden units for each hidden layer
        :param act_fun: tensorflow activation function
        :param n_mades: number of mades
        :param batch_norm: whether to use batch normalization between mades
        :param input_order: order of inputs of last made
        :param mode: strategy for assigning degrees to hidden nodes: can be 'random' or 'sequential'
        :param input: tensorflow placeholder to serve as input; if None, a new placeholder is created
        """

        # save input arguments
        self.n_inputs = n_inputs
        self.n_hiddens = n_hiddens
        self.act_fun = act_fun
        self.n_mades = n_mades
        self.batch_norm = batch_norm
        self.momentum = momentum
        self.mode = mode

        self.input = tf.placeholder(dtype=dtype,
                                    shape=[None, n_inputs],
                                    name='x') if input is None else input
        self.training = tf.placeholder_with_default(False,
                                                    shape=(),
                                                    name="training")
        self.parms = []

        self.mades = []
        self.bns = []
        self.moments = []
        self.assign_bns = []
        self.u = self.input
        self.logdet_dudx = 0.0

        for i in range(n_mades):

            # create a new made
            made = mades.GaussianMade(n_inputs, n_hiddens, act_fun,
                                      input_order, mode, self.u)
            self.mades.append(made)
            self.parms += made.parms
            # invert input order
            input_order = input_order if input_order == 'random' else made.input_order[::
                                                                                       -1]

            # inverse autoregressive transform
            self.u = made.u
            self.logdet_dudx += 0.5 * tf.reduce_sum(
                made.logp, axis=1, keepdims=True)

            # batch normalization
            if batch_norm:
                bn = BatchNormalization()
                moments = tf.nn.moments(self.u, [0])
                v_tmp = moments[1]
                self.u = bn(self.u, training=self.training)
                self.parms += [bn.loggamma, bn.beta]
                v_tmp = tf.cond(self.training, lambda: v_tmp,
                                lambda: bn.variance)
                self.logdet_dudx += tf.reduce_sum(
                    bn.loggamma) - 0.5 * tf.reduce_sum(tf.log(v_tmp + 1e-5))
                self.bns.append(bn)
                self.moments.append(moments)
                self.assign_bns.append(tf.assign(bn.mean, moments[0]))
                self.assign_bns.append(tf.assign(bn.variance, moments[1]))

        self.input_order = self.mades[0].input_order

        # log likelihoods
        self.L = tf.add(-0.5 * n_inputs * np.log(2 * np.pi) -
                        0.5 * tf.reduce_sum(self.u**2, axis=1, keepdims=True),
                        self.logdet_dudx,
                        name='L')

        # train objective
        self.trn_loss = -tf.reduce_mean(self.L, name='trn_loss')