public void SetNeuralNetwork(IFunctionApproximator fapp) { FeedForwardDeepNeuralNetwork ffnn = fapp as FeedForwardDeepNeuralNetwork; if (null == ffnn) { throw new Exception("Only supporting FeedForwardDeepNeuralNetwork at this stage."); } this.hiddenLayers = new Layer[ffnn.GetNumberOfHiddenLayers()]; for (int i = 0; i < hiddenLayers.Length; ++i) { this.hiddenLayers[i] = ffnn.GetHiddenLayer(i); } this.outputLayer = ffnn.GetOutputLayer(); this.hiddenSensitivities = new LayerSensitivity[ffnn.GetNumberOfHiddenLayers()]; for (int i = 0; i < hiddenLayers.Length; ++i) { this.hiddenSensitivities[i] = new LayerSensitivity(ffnn.GetHiddenLayer(i)); } this.outputSensitivity = new LayerSensitivity(outputLayer); }
public void SetNeuralNetwork(IFunctionApproximator fapp) { FeedForwardNeuralNetwork ffnn = fapp as FeedForwardNeuralNetwork; this.hiddenLayer = ffnn.GetHiddenLayer(); this.outputLayer = ffnn.GetOutputLayer(); this.hiddenSensitivity = new LayerSensitivity(hiddenLayer); this.outputSensitivity = new LayerSensitivity(outputLayer); }
public Matrix SensitivityMatrixFromSucceedingLayer(LayerSensitivity nextLayerSensitivity) { Layer nextLayer = nextLayerSensitivity.GetLayer(); Matrix derivativeMatrix = CreateDerivativeMatrix(layer.GetLastInducedField()); Matrix weightTranspose = nextLayer.GetWeightMatrix() .Transpose(); Matrix calculatedSensitivityMatrix = derivativeMatrix.Times(weightTranspose) .Times(nextLayerSensitivity.GetSensitivityMatrix()); sensitivityMatrix = calculatedSensitivityMatrix.Copy(); return(sensitivityMatrix); }
public static Matrix CalculateWeightUpdates(LayerSensitivity layerSensitivity, Vector previousLayerActivationOrInput, double alpha) { Layer layer = layerSensitivity.GetLayer(); Matrix activationTranspose = previousLayerActivationOrInput.Transpose(); Matrix weightUpdateMatrix = layerSensitivity.GetSensitivityMatrix() .Times(activationTranspose) .Times(alpha) .Times(-1.0); layer.AcceptNewWeightUpdate(weightUpdateMatrix.Copy()); return(weightUpdateMatrix); }
public static Vector CalculateBiasUpdates(LayerSensitivity layerSensitivity, double alpha) { Layer layer = layerSensitivity.GetLayer(); Matrix biasUpdateMatrix = layerSensitivity.GetSensitivityMatrix() .Times(alpha) .Times(-1.0); Vector result = new Vector(biasUpdateMatrix.GetRowDimension()); for (int i = 0; i < biasUpdateMatrix.GetRowDimension(); ++i) { result.SetValue(i, biasUpdateMatrix.Get(i, 0)); } layer.AcceptNewBiasUpdate(result.CopyVector()); return(result); }
public Vector CalculateBiasUpdates(LayerSensitivity layerSensitivity, double alpha, double momentum) { Layer layer = layerSensitivity.GetLayer(); Matrix biasUpdateMatrixWithoutMomentum = layerSensitivity.GetSensitivityMatrix().Times(alpha).Times(-1.0); Matrix biasUpdateMatrixWithMomentum = layer.GetLastBiasUpdateVector() .Times(momentum) .Plus(biasUpdateMatrixWithoutMomentum .Times(1.0 - momentum)); Vector result = new Vector(biasUpdateMatrixWithMomentum.GetRowDimension()); for (int i = 0; i < biasUpdateMatrixWithMomentum.GetRowDimension(); ++i) { result.SetValue(i, biasUpdateMatrixWithMomentum.Get(i, 0)); } layer.AcceptNewBiasUpdate(result.CopyVector()); return(result); }
public Matrix CalculateWeightUpdates(LayerSensitivity layerSensitivity, Vector previousLayerActivationOrInput, double alpha, double momentum) { Layer layer = layerSensitivity.GetLayer(); Matrix activationTranspose = previousLayerActivationOrInput.Transpose(); Matrix momentumLessUpdate = layerSensitivity.GetSensitivityMatrix() .Times(activationTranspose) .Times(alpha) .Times(-1.0); Matrix updateWithMomentum = layer.GetLastWeightUpdateMatrix() .Times(momentum) .Plus(momentumLessUpdate.Times(1.0 - momentum)); layer.AcceptNewWeightUpdate(updateWithMomentum.Copy()); return(updateWithMomentum); }