Source code for pmlearn.neural_network.multilayer_perceptron

"""
Multilayer perceptron
"""

# Authors: Daniel Emaasit <daniel.emaasit@gmail.com>
#
# License: BSD 3 clause

import numpy as np
import pymc3 as pm
import theano

from ..base import BayesianModel, BayesianClassifierMixin

floatX = theano.config.floatX


[docs]class MLPClassifier(BayesianModel, BayesianClassifierMixin): """ Multilayer perceptron classification built using PyMC3. Fit a Multilayer perceptron classification model and estimate model parameters using MCMC algorithms or Variational Inference algorithms Parameters ---------- Examples -------- Reference ---------- http://twiecki.github.io/blog/2016/06/01/bayesian-deep-learning/ """ def __init__(self, n_hidden=5): self.n_hidden = n_hidden self.num_training_samples = None self.num_pred = None self.total_size = None super(MLPClassifier, self).__init__()
[docs] def create_model(self): """ Returns ------- """ model_input = theano.shared(np.zeros([self.num_training_samples, self.num_pred])) model_output = theano.shared(np.zeros(self.num_training_samples)) self.shared_vars = { 'model_input': model_input, 'model_output': model_output, } self.total_size = len(model_output.get_value()) # Initialize random weights between each layer init_1 = np.random.randn(self.num_pred, self.n_hidden).astype(floatX) init_2 = np.random.randn(self.n_hidden, self.n_hidden).astype(floatX) init_out = np.random.randn(self.n_hidden).astype(floatX) model = pm.Model() with model: # Weights from input to hidden layer weights_in_1 = pm.Normal('w_in_1', 0, sd=1, shape=(self.num_pred, self.n_hidden), testval=init_1) # Weights from 1st to 2nd layer weights_1_2 = pm.Normal('w_1_2', 0, sd=1, shape=(self.n_hidden, self.n_hidden), testval=init_2) # Weights from hidden layer to output weights_2_out = pm.Normal('w_2_out', 0, sd=1, shape=(self.n_hidden,), testval=init_out) # Build neural-network using tanh activation function act_1 = pm.math.tanh(pm.math.dot(model_input, weights_in_1)) act_2 = pm.math.tanh(pm.math.dot(act_1, weights_1_2)) act_out = pm.math.sigmoid(pm.math.dot(act_2, weights_2_out)) # Binary classification -> Bernoulli likelihood y = pm.Bernoulli('y', act_out, observed=model_output, total_size=self.total_size) return model
[docs] def save(self, file_prefix): params = { 'inference_type': self.inference_type, 'num_pred': self.num_pred, 'num_training_samples': self.num_training_samples } super(MLPClassifier, self).save(file_prefix, params)
[docs] def load(self, file_prefix): params = super(MLPClassifier, self).load(file_prefix, load_custom_params=True) self.inference_type = params['inference_type'] self.num_pred = params['num_pred'] self.num_training_samples = params['num_training_samples']