classdef DeepBeliefNetwork < handle
% A deep belief network composed of 'nLayer' layers of restricted
% Boltzmann machines.
%
% Florian Raudies, 01/08/2014, Boston University.
%
% This is a re-implementation of Andrej Karpathy's code which was
% based on Kevin Swersky and Ruslan Salakhutdinov's code.
properties (SetAccess = private)
Layer % Layers for Restricted Boltzmann Machines.
end
properties
DimLayer % Dimensions for each layer.
nLayer % Number of layers.
end
methods
% Constructor.
function obj = DeepBeliefNetwork(DimLayer)
obj.DimLayer = DimLayer;
obj.nLayer = length(DimLayer);
obj.Layer = cell(obj.nLayer,1);
for iLayer = 1:obj.nLayer,
obj.Layer{iLayer} = RestrictedBoltzmannMachine();
end
end
% Fit 'Data' to 'Labels' through a deep belief network.
function obj = fit(obj, Data, Label)
if obj.nLayer > 1,
obj.Layer{1}.trainContrastiveConvergence(...
Data, obj.DimLayer(1));
for iLayer = 2:obj.nLayer-1
obj.Layer{iLayer}.trainContrastiveConvergence(...
obj.Layer{iLayer-1}.T, obj.DimLayer(iLayer));
end
% Train the last layer with labels.
obj.Layer{obj.nLayer}.fitContrastiveConvergence(...
obj.Layer{obj.nLayer-1}.T, Label, ...
obj.DimLayer(obj.nLayer));
else
obj.Layer{1}.fitContrastiveConvergence(...
Data, Label, obj.DimLayer(1));
end
end
% Predict labels depending on 'Data'.
function P = predict(obj, Data)
for iLayer = 1:obj.nLayer-1,
Data = obj.Layer{iLayer}.visibleToHidden(Data);
end
P = obj.Layer{obj.nLayer}.predict(Data);
end
% Retrieve the internal activation when probing with 'Data'.
% This method assumes that all hidden layers have the same size.
function P = probe(obj, Data)
nState = size(Data,1);
P = zeros(obj.nLayer,obj.DimLayer(1),nState);
for iState = 1:nState,
Data4State = Data(iState,:);
for iLayer = 1:obj.nLayer,
Data4State = obj.Layer{iLayer}.visibleToHidden(Data4State);
P(iLayer,:,iState) = Data4State;
end
end
end
% Get network representation for a 'iLayer'.
function rbm = getLayer(obj,iLayer)
rbm = obj.Layer{iLayer};
end
% Get network representation for the last layer.
function rbm = getLastLayer(obj)
rbm = obj.Layer{obj.nLayer};
end
% Set flag which indicates training in ordered blocks.
function obj = setBlockTrain(obj,flag)
for iLayer = 1:obj.nLayer,
obj.Layer{iLayer}.setBlockTrain(flag);
end
end
end
end