private void learnLayerUnsupervised()
{
if (!Main.CanGenerate) return;
Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
new Task(() =>
{
DeepBeliefNetworkLearning teacher = new DeepBeliefNetworkLearning(Main.Network)
{
Algorithm = (h, v, i) => new ContrastiveDivergenceLearning(h, v)
{
LearningRate = LearningRate,
Momentum = 0.5,
Decay = WeightDecay,
},
LayerIndex = SelectedLayerIndex - 1,
};
double[][] inputs;
Main.Database.Training.GetInstances(out inputs);
int batchCount = Math.Max(1, inputs.Length / BatchSize);
// Create mini-batches to speed learning
int[] groups = Accord.Statistics.Tools
.RandomGroups(inputs.Length, batchCount);
double[][][] batches = inputs.Subgroups(groups);
// Gather learning data for the layer
double[][][] layerData = teacher.GetLayerInput(batches);
var cd = teacher.GetLayerAlgorithm(teacher.LayerIndex) as ContrastiveDivergenceLearning;
// Start running the learning procedure
for (int i = 0; i < Epochs && !shouldStop; i++)
{
double error = teacher.RunEpoch(layerData) / inputs.Length;
dispatcher.BeginInvoke((Action<int, double>)updateError,
DispatcherPriority.ContextIdle, i + 1, error);
if (i == 10)
cd.Momentum = Momentum;
}
IsLearning = false;
}).Start();
}