package org.neuroph.nnet.learning;

import java.util.List;
import org.neuroph.core.Connection;
import org.neuroph.nnet.comp.layer.ConvolutionalLayer;
import org.neuroph.nnet.comp.layer.FeatureMapLayer;
import org.neuroph.core.Layer;
import org.neuroph.core.Neuron;
import org.neuroph.core.transfer.TransferFunction;

public class ConvolutionalBackpropagation extends MomentumBackpropagation {

	private static final long serialVersionUID = -7134947805154423695L;

        @Override
	protected void calculateErrorAndUpdateHiddenNeurons() {
		List layers = neuralNetwork.getLayers();
		for (int layerIdx = layers.size() - 2; layerIdx > 0; layerIdx--) {
			for (Neuron neuron : layers.get(layerIdx).getNeurons()) {
				double neuronError = this.calculateHiddenNeuronError(neuron);
				neuron.setDelta(neuronError);
				if (layers.get(layerIdx) instanceof ConvolutionalLayer) { // if it is convolutional layer c=adapt weughts, dont touch pooling. Pooling just propagate the error
					this.calculateWeightChanges(neuron);
				}
			} // for
		} // for
	}

        
        // ova mora da se overriduje jer glavna uzima izvod //  ali ova treba samo za pooling sloj 
    @Override     
    protected double calculateHiddenNeuronError(Neuron neuron) {

        // for convolutional layers use standard backprop formula
        if (neuron.getParentLayer() instanceof ConvolutionalLayer ) {
            return super.calculateHiddenNeuronError(neuron);
        }
                
        // for pooling layer just transfer error without using tranfer function derivative
        double deltaSum = 0d;
        for (Connection connection : neuron.getOutConnections()) {
            double delta = connection.getToNeuron().getDelta()
                    * connection.getWeight().value;
            deltaSum += delta; // weighted delta sum from the next layer
        } // for

       return deltaSum;
    }        
        
//	@Override
//	protected double calculateHiddenNeuronError(Neuron neuron) {
//		double totalError = super.calculateHiddenNeuronError(neuron);
//
//        if (neuron.getParentLayer() instanceof  Layer2D) {
//            Layer2D parentLayer = (Layer2D) neuron.getParentLayer();
//            double weight = parentLayer.getHeight() * parentLayer.getWidth();
//            return totalError / weight;
//        }
//        return totalError;
//	}

}

 

Ads help maintain this website.