private static float CostFunction(Single1D aa, Single1D yy, CostFunctionEnum costFunction) { return(costFunction switch { CostFunctionEnum.Quadratic => QuadraticCostFunction(aa, yy), CostFunctionEnum.CrossEntropy => CrossEntropyCostFunction(aa, yy), _ => throw new InvalidCaseException(nameof(costFunction), costFunction, 386203), });
// ---------------------------------------------------------------------------------------- #region Network public float GetCostAndDerivatives( SampleList samples, Single1D derivatives, MeasurementList measurements, CalculationArguments arguments) { CostFunctionEnum costFunction = arguments.settings.CostFunction; float lambda = arguments.settings.Lambda; int nSamples = samples.Count; int nCoeffs = derivatives.Count; float cost = 0f; Layer last = Last; for (int i = 0; i < nCoeffs; i++) { derivatives[i] = 0f; } for (int iSample = 0; iSample < nSamples; iSample++) { arguments.ThrowIfCancellationRequested(); Sample sample = samples[iSample]; Single1D measurement = measurements[iSample]; Input.SetActivations(sample.Inputs, 0); FeedForward(true); last.GetActivations(measurement, 0); cost += CostFunction(measurement, sample.Requirements, costFunction); int weightCount = CountWeight(); cost += 0.5f * lambda * SumWeightSqr() / weightCount; // regularization last.CalculateDeltas(sample.Requirements, costFunction); FeedBackward(true); AddDerivatives(derivatives, 0, lambda / weightCount); arguments.reporter?.ReportProgress(iSample, nSamples); } arguments.reporter?.ReportProgress(0, nSamples); cost /= nSamples; for (int i = 0; i < nCoeffs; i++) { derivatives[i] /= nSamples; } return(cost); }
public virtual void CalculateDeltas(Single1D ys, CostFunctionEnum costFunction) // This must be the last layer in the network { }