protected void InitCache(List <ILayer> s_forwardRNN, List <ILayer> s_backwardRNN, IOutputLayer outputLayer) { forwardHiddenLayers = s_forwardRNN; backwardHiddenLayers = s_backwardRNN; //Initialize output layer OutputLayer = outputLayer; forwardCellList = new List <Neuron[]>(); backwardCellList = new List <Neuron[]>(); for (int i = 0; i < numOfLayers; i++) { var forwardCells = new Neuron[MaxSeqLength]; var backwardCells = new Neuron[MaxSeqLength]; for (int j = 0; j < MaxSeqLength; j++) { if (forwardHiddenLayers[i] is DropoutLayer) { forwardCells[j] = new DropoutNeuron(forwardHiddenLayers[i].LayerSize); backwardCells[j] = new DropoutNeuron(forwardHiddenLayers[i].LayerSize); } else if (forwardHiddenLayers[i] is LSTMLayer) { forwardCells[j] = new LSTMNeuron(forwardHiddenLayers[i].LayerSize); backwardCells[j] = new LSTMNeuron(forwardHiddenLayers[i].LayerSize); } else { forwardCells[j] = new Neuron(forwardHiddenLayers[i].LayerSize); backwardCells[j] = new Neuron(forwardHiddenLayers[i].LayerSize); } } forwardCellList.Add(forwardCells); backwardCellList.Add(backwardCells); } OutputCells = new Neuron[MaxSeqLength]; for (var i = 0; i < MaxSeqLength; i++) { OutputCells[i] = new Neuron(OutputLayer.LayerSize); } InitLayersOutputCache(); }
public void InitCache(List <SimpleLayer> s_forwardRNN, List <SimpleLayer> s_backwardRNN, SimpleLayer outputLayer) { forwardHiddenLayers = s_forwardRNN; backwardHiddenLayers = s_backwardRNN; //Initialize output layer OutputLayer = outputLayer; forwardCellList = new List <Neuron[]>(); backwardCellList = new List <Neuron[]>(); fErrLayers = new List <float[][]>(); bErrLayers = new List <float[][]>(); for (int i = 0; i < numOfLayers; i++) { var forwardCells = new Neuron[MaxSeqLength]; var backwardCells = new Neuron[MaxSeqLength]; var fErrLayer = new float[MaxSeqLength][]; var bErrLayer = new float[MaxSeqLength][]; for (int j = 0; j < MaxSeqLength; j++) { if (forwardHiddenLayers[i] is DropoutLayer) { forwardCells[j] = new DropoutNeuron(); backwardCells[j] = new DropoutNeuron(); ((DropoutNeuron)forwardCells[j]).mask = new bool[forwardHiddenLayers[i].LayerSize]; ((DropoutNeuron)backwardCells[j]).mask = new bool[forwardHiddenLayers[i].LayerSize]; } else if (forwardHiddenLayers[i] is LSTMLayer) { var lstmForwardCell = new LSTMNeuron(); var lstmBackwardCell = new LSTMNeuron(); lstmForwardCell.LSTMCells = new LSTMCell[forwardHiddenLayers[i].LayerSize]; lstmBackwardCell.LSTMCells = new LSTMCell[forwardHiddenLayers[i].LayerSize]; for (int k = 0; k < forwardHiddenLayers[i].LayerSize; k++) { lstmForwardCell.LSTMCells[k] = new LSTMCell(); lstmBackwardCell.LSTMCells[k] = new LSTMCell(); } forwardCells[j] = lstmForwardCell; backwardCells[j] = lstmBackwardCell; } else { forwardCells[j] = new Neuron(); backwardCells[j] = new Neuron(); } forwardCells[j].Cells = new float[forwardHiddenLayers[i].LayerSize]; forwardCells[j].PrevCellOutputs = new float[forwardHiddenLayers[i].LayerSize]; backwardCells[j].Cells = new float[forwardHiddenLayers[i].LayerSize]; backwardCells[j].PrevCellOutputs = new float[forwardHiddenLayers[i].LayerSize]; fErrLayer[j] = new float[forwardHiddenLayers[i].LayerSize]; bErrLayer[j] = new float[forwardHiddenLayers[i].LayerSize]; } forwardCellList.Add(forwardCells); backwardCellList.Add(backwardCells); fErrLayers.Add(fErrLayer); bErrLayers.Add(bErrLayer); } InitOutputLayerCache(); }