public void QuadraticTest() { var actual = new Matrix(4, 1); var expected = new Matrix(4, 1); actual.InRandomize(); expected.InRandomize(); var autoErr = new QuadraticCost().Evaluate(actual, expected); var error = 0.0; for (var i = 0; i < actual.Rows; i++) { for (var j = 0; j < actual.Columns; j++) { error += Math.Pow(actual[i, j] - expected[i, j], 2); } } error /= 2; error /= actual.Rows * actual.Columns; Assert.IsTrue(Math.Abs(error - autoErr) < 0.01, new QuadraticCost().Type().ToString() + " Forward!"); var autoDErr = new QuadraticCost().Backward(actual, expected); var dErr = new Matrix(actual.Rows, actual.Columns); for (var i = 0; i < actual.Rows; i++) { for (var j = 0; j < actual.Columns; j++) { dErr[i, j] = Math.Pow(expected[i, j] - actual[i, j], 2); } } dErr *= 1.0 / actual.Rows * actual.Columns; Assert.IsTrue(Math.Abs(dErr.FrobeniusNorm() - autoDErr.FrobeniusNorm()) < 0.01, new QuadraticCost().Type().ToString() + " Backward!"); }
public void SetUp() { _sut = new QuadraticCost(); }
public void InitNetwork(ECostType costType, CostSettings costSettings, EOptimizerType optimizerType, OptimizerSettings optimizerSettings) { Utility.Dims InShape; Utility.Dims OutShape; Utility.Dims WShape; for (int i = 1; i < Layers.Count; i++) { Data.Data["a" + i.ToString()] = new Matrix(Layers[i].NCount, 1); InShape = new Utility.Dims(Layers[i].NCount, 1); Data.Data["b" + i.ToString()] = Matrix.RandomMatrix(Layers[i].NCount, 1, 1, EDistrubution.Gaussian); OutShape = new Utility.Dims(Layers[i].NCount, 1); Data.Data["W" + i.ToString()] = Matrix.RandomMatrix(Layers[i - 1].NCount, Layers[i].NCount, 1, EDistrubution.Gaussian); WShape = new Utility.Dims(Layers[i - 1].NCount, Layers[i].NCount); Layers[i].SetSettings(new LayerSettings(InShape, OutShape, WShape)); } Data.Data["a0"] = new Matrix(Layers[0].NCount, 1); InShape = new Utility.Dims(Layers[0].NCount, 1); Data.Data["b0"] = new Matrix(Layers[0].NCount, 1); OutShape = new Utility.Dims(Layers[0].NCount, 1); Data.Data["W0"] = new Matrix(Layers[0].NCount * Layers[1].NCount, Layers[1].NCount); WShape = new Utility.Dims(Layers[0].NCount * Layers[1].NCount, Layers[1].NCount); Layers[0].SetSettings(new LayerSettings(InShape, OutShape, WShape)); switch (costType) { case ECostType.Invalid: throw new ArgumentException("Invalid Cost Function Selected!"); case ECostType.CrossEntropyCost: CostFunction = new CrossEntropyCost((CrossEntropyCostSettings)costSettings); break; case ECostType.ExponentionalCost: CostFunction = new ExponentionalCost((ExponentionalCostSettings)costSettings); break; case ECostType.GeneralizedKullbackLeiblerDivergence: CostFunction = new GeneralizedKullbackLeiblerDivergence((GeneralizedKullbackLeiblerDivergenceSettings)costSettings); break; case ECostType.HellingerDistance: CostFunction = new HellingerDistance((HellingerDistanceSettings)costSettings); break; case ECostType.ItakuraSaitoDistance: CostFunction = new ItakuraSaitoDistance((ItakuraSaitoDistanceSettings)costSettings); break; case ECostType.KullbackLeiblerDivergence: CostFunction = new KullbackLeiblerDivergence((KullbackLeiblerDivergenceSettings)costSettings); break; case ECostType.QuadraticCost: CostFunction = new QuadraticCost((QuadraticCostSettings)costSettings); break; default: throw new ArgumentException("Invalid Cost Function Selected!"); } switch (optimizerType) { case EOptimizerType.Invalid: throw new ArgumentException("Invalid Optimizer Function Selected!"); case EOptimizerType.AdaDelta: OptimizerFunction = new AdaDelta((AdaDeltaSettings)optimizerSettings); break; case EOptimizerType.AdaGrad: OptimizerFunction = new AdaGrad((AdaGradSettings)optimizerSettings); break; case EOptimizerType.Adam: OptimizerFunction = new Adam((AdamSettings)optimizerSettings); break; case EOptimizerType.Adamax: OptimizerFunction = new Adamax((AdamaxSettings)optimizerSettings); break; case EOptimizerType.GradientDescent: OptimizerFunction = new GradientDescent((GradientDescentSettings)optimizerSettings); break; case EOptimizerType.Momentum: OptimizerFunction = new Momentum((MomentumSettings)optimizerSettings); break; case EOptimizerType.Nadam: OptimizerFunction = new Nadam((NadamSettings)optimizerSettings); break; case EOptimizerType.NesterovMomentum: OptimizerFunction = new NesterovMomentum((NesterovMomentumSettings)optimizerSettings); break; case EOptimizerType.RMSProp: OptimizerFunction = new RMSProp((RMSPropSettings)optimizerSettings); break; default: throw new ArgumentException("Invalid Optimizer Function Selected!"); } }