感知器故障(Malfunctioning perceptron)
我是机器学习的新手,在进入多层网络之前一直在尝试基本的感知器。
我遇到的问题是下面的代码。 我有一个训练数据生成器,它使用一组权重来生成真值表。
我遇到的问题是感知器能够在使用设置'A'而不是设置'B'生成训练数据时解决/确定权重集。 当给定使用集合'B'生成的训练数据时,它会在无限循环中继续尝试确定权重(这是本地最小问题吗?)
我不明白为什么会发生这种情况。 任何帮助或建议表示赞赏。
提前致谢。
// Calling function public static void TestPerceptron () { // Problem: // When training data is generated using the 'A' set of weights, the perceptron is able to determine the correct weights based on the given training data. // When training data is generated using the 'B' set of weights, the perceptron never completes training and is stuck in an infinite loop double[] weights = new double[] { //3,2,2,3 // A 3,2,1,3,1 // B }; double bias = 0.0; var trainingData = PerceptronHelper.GenerateDataSetUsingWeights (weights, bias); var perceptron = new Perceptron (); perceptron.Train (trainingData, null, null); //perceptron.Train (trainingData, weights, bias); } public class Perceptron { private static Random r = new Random (); protected double _bias = r.NextDouble(); protected double[] _weights; protected virtual double ComputeOutput(double[] weights, double[] inputs, double bias) { var total = 0.0; for (var index = 0; index < inputs.Length-1; index++) { total += weights [index] * inputs [index]; } return total + (1 * bias); } protected virtual void SetWeights(ref double[] weights, double[] inputs, double error, double learningRate, ref double bias) { for (var index = 0; index < inputs.Length-1; index++) { weights[index] = weights [index] + (learningRate * error * inputs [index]); } bias += learningRate * error * 1; } public virtual void Train(double[][] trainingData, double[] idealWeights, double? idealBias) { var learningRate = 1.0; var totalError = 1.0; var targetError = 0.0; var epochs = 0.0; var bias = _bias; var weights = new double[trainingData[0].Length-1]; if (idealBias.HasValue) bias = idealBias.Value; if (idealWeights != null) weights = idealWeights; while (totalError > targetError) { totalError = 0.0; for (var index = 0; index < trainingData.Length; index++) { var inputs = trainingData [index]; // get target var target = inputs [inputs.Length - 1]; // compute output var computed = ComputeOutput (weights, inputs, bias); // pass computed through activation var output = PerceptronHelper.Activation (computed); // determine error var error = (target - output); // adjust weights SetWeights (ref weights, inputs, error, learningRate, ref bias); totalError += Math.Abs(error); var weightsMsg = "Weights: "; foreach(var weight in weights) { weightsMsg += weight + "|"; } Console.WriteLine (String.Format ("error: {0} weights: {1} bias: {2}", totalError, weightsMsg, bias)); } epochs++; } _bias = bias; _weights = weights; } public void Predict(double[] inputs) { var sum = 0.0; for (var index = 0; index < inputs.Length; index++) { sum += inputs [index] * _weights [index] + 1 * _bias; Console.WriteLine (String.Format("input: {0} weight: {1} bias: {2}", inputs[index], _weights[index], _bias)); } var output = PerceptronHelper.Activation (sum); Console.WriteLine ("Output:{0}", output); } } public static class PerceptronHelper { // generate training data based on given weights - the number of inputs = number of weights public static double[][] GenerateDataSetUsingWeights(double[] idealWeights, double bias) { var weights = idealWeights; var inputs = new double[weights.Length]; var numInputCombinations = Math.Pow(2,inputs.Length); var trainData = new double[(int)numInputCombinations][]; int inputValue = 0; // generate training data for (var index = 0; index < numInputCombinations; index++) { var sum = 0.0; // last item in array is expected output var trainDataLine = new double[weights.Length+1]; var binary = Convert.ToString (inputValue, 2); binary = binary.PadLeft (weights.Length, '0'); // create training data line for (var wIndex = 0; wIndex < weights.Length; wIndex++) { inputs [wIndex] = double.Parse(binary[wIndex].ToString()); trainDataLine [wIndex] = inputs [wIndex]; sum += inputs [wIndex] * weights [wIndex]; } sum += (1 * bias); var output = Activation (sum); // store the expected result in the last item of the array trainDataLine [weights.Length] = output; // add the line to the data trainData[index] = trainDataLine; inputValue++; } return trainData; } public static double Activation (double sum) { Console.WriteLine (String.Format("evaluating :{0}", sum)); return Math.Abs(sum) >= 5 ? 1 : 0; } }
输出样本:
I am a newbie to machine learning and have been experimenting with basic perceptrons before moving on to multilayer networks.
The problem I have is with the code below. I have a training data generator which uses a set of weights to generate a truth table.
The problem I have is the perceptron is able to solve/determine the set of weights when the training data was generated with set 'A' but not with set 'B'. When given training data that was generated with set 'B', it continues in an infinite loop trying to determine the weights (is this a local minimum issue?)
I do not understand exactly why this is happening. Any help or advice is appreciated.
Thanks in advance.
// Calling function public static void TestPerceptron () { // Problem: // When training data is generated using the 'A' set of weights, the perceptron is able to determine the correct weights based on the given training data. // When training data is generated using the 'B' set of weights, the perceptron never completes training and is stuck in an infinite loop double[] weights = new double[] { //3,2,2,3 // A 3,2,1,3,1 // B }; double bias = 0.0; var trainingData = PerceptronHelper.GenerateDataSetUsingWeights (weights, bias); var perceptron = new Perceptron (); perceptron.Train (trainingData, null, null); //perceptron.Train (trainingData, weights, bias); } public class Perceptron { private static Random r = new Random (); protected double _bias = r.NextDouble(); protected double[] _weights; protected virtual double ComputeOutput(double[] weights, double[] inputs, double bias) { var total = 0.0; for (var index = 0; index < inputs.Length-1; index++) { total += weights [index] * inputs [index]; } return total + (1 * bias); } protected virtual void SetWeights(ref double[] weights, double[] inputs, double error, double learningRate, ref double bias) { for (var index = 0; index < inputs.Length-1; index++) { weights[index] = weights [index] + (learningRate * error * inputs [index]); } bias += learningRate * error * 1; } public virtual void Train(double[][] trainingData, double[] idealWeights, double? idealBias) { var learningRate = 1.0; var totalError = 1.0; var targetError = 0.0; var epochs = 0.0; var bias = _bias; var weights = new double[trainingData[0].Length-1]; if (idealBias.HasValue) bias = idealBias.Value; if (idealWeights != null) weights = idealWeights; while (totalError > targetError) { totalError = 0.0; for (var index = 0; index < trainingData.Length; index++) { var inputs = trainingData [index]; // get target var target = inputs [inputs.Length - 1]; // compute output var computed = ComputeOutput (weights, inputs, bias); // pass computed through activation var output = PerceptronHelper.Activation (computed); // determine error var error = (target - output); // adjust weights SetWeights (ref weights, inputs, error, learningRate, ref bias); totalError += Math.Abs(error); var weightsMsg = "Weights: "; foreach(var weight in weights) { weightsMsg += weight + "|"; } Console.WriteLine (String.Format ("error: {0} weights: {1} bias: {2}", totalError, weightsMsg, bias)); } epochs++; } _bias = bias; _weights = weights; } public void Predict(double[] inputs) { var sum = 0.0; for (var index = 0; index < inputs.Length; index++) { sum += inputs [index] * _weights [index] + 1 * _bias; Console.WriteLine (String.Format("input: {0} weight: {1} bias: {2}", inputs[index], _weights[index], _bias)); } var output = PerceptronHelper.Activation (sum); Console.WriteLine ("Output:{0}", output); } } public static class PerceptronHelper { // generate training data based on given weights - the number of inputs = number of weights public static double[][] GenerateDataSetUsingWeights(double[] idealWeights, double bias) { var weights = idealWeights; var inputs = new double[weights.Length]; var numInputCombinations = Math.Pow(2,inputs.Length); var trainData = new double[(int)numInputCombinations][]; int inputValue = 0; // generate training data for (var index = 0; index < numInputCombinations; index++) { var sum = 0.0; // last item in array is expected output var trainDataLine = new double[weights.Length+1]; var binary = Convert.ToString (inputValue, 2); binary = binary.PadLeft (weights.Length, '0'); // create training data line for (var wIndex = 0; wIndex < weights.Length; wIndex++) { inputs [wIndex] = double.Parse(binary[wIndex].ToString()); trainDataLine [wIndex] = inputs [wIndex]; sum += inputs [wIndex] * weights [wIndex]; } sum += (1 * bias); var output = Activation (sum); // store the expected result in the last item of the array trainDataLine [weights.Length] = output; // add the line to the data trainData[index] = trainDataLine; inputValue++; } return trainData; } public static double Activation (double sum) { Console.WriteLine (String.Format("evaluating :{0}", sum)); return Math.Abs(sum) >= 5 ? 1 : 0; } }
A sample of the output:
原文:https://stackoverflow.com/questions/29885530
相关文章
更多实现Hadoop中的机架感知
Hadoop机架感知与balancer
Hadoop配置机架感知(Python脚本)
Facebook的Hadoop应用与故障转移方案
Hadoop集群启动机架感知
SecondaryNamenode配置与NameNode故障恢复
Hadoop Datanode支持磁盘故障代码hack
Windows7系统蓝屏故障分析:蓝屏代码详解
Windows XP/Vista/Windows 7常见蓝屏故障分析
Hadoop集群网络性能优化:Hadoop机架感知实现及配置
最新问答
更多获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
如何通过引用返回对象?(How is returning an object by reference possible?)
矩阵如何存储在内存中?(How are matrices stored in memory?)
每个请求的Java新会话?(Java New Session For Each Request?)
css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
xcode语法颜色编码解释?(xcode syntax color coding explained?)
在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
Copyright ©2023 peixunduo.com All Rights Reserved.粤ICP备14003112号
本站部分内容来源于互联网,仅供学习和参考使用,请莫用于商业用途。如有侵犯你的版权,请联系我们(neng862121861#163.com),本站将尽快处理。谢谢合作!