/// <summary> /// 构造函数 /// </summary> /// <param name="inputWidth"></param> /// <param name="inputHeight"></param> /// <param name="receptiveFieldWidth"></param> /// <param name="receptiveFieldHeight"></param> /// <param name="offsetWidth"></param> /// <param name="offsetHeight"></param> /// <param name="activationFunctionType">激活函数类型,1:tanh,2:PReLU,3:Sigmoid</param> /// <param name="inputCount"></param> /// <param name="outputCount"></param> public CnnKernel(int inputWidth, int inputHeight, int receptiveFieldWidth, int receptiveFieldHeight, int offsetWidth, int offsetHeight, ActivationFunctionTypes activationFunctionType, int inputCount, int outputCount, bool standardization) { this.receptiveFieldWidth = receptiveFieldWidth; this.receptiveFieldHeight = receptiveFieldHeight; this.inputWidth = inputWidth; this.inputHeight = inputHeight; this.offsetWidth = offsetWidth; this.offsetHeight = offsetHeight; this.ActivationFunctionType = activationFunctionType; this.InputCount = inputCount; this.OutputCount = outputCount; this.Standardization = standardization; this.ConvolutionKernelWidth = Convert.ToInt32(Math.Ceiling((inputWidth - receptiveFieldWidth) / (double)offsetWidth)) + 1; this.ConvolutionKernelHeight = Convert.ToInt32(Math.Ceiling((inputHeight - receptiveFieldHeight) / (double)offsetHeight)) + 1; ShareWeight = new List <double[, ]>(); meanDeltaWeight = new List <double[, ]>(); for (int i = 0; i < inputCount; i++) { ShareWeight.Add(new double[receptiveFieldWidth, receptiveFieldHeight]); meanDeltaWeight.Add(new double[receptiveFieldWidth, receptiveFieldHeight]); } meanListDeltaWeight = new List <List <double[, ]> >(); meanListDeltaOffset = new List <double>(); InitShareWeight(); }
/// <summary> /// 构造函数 /// </summary> /// <param name="InputCount"></param> /// <param name="OutputCount"></param> /// <param name="activationFunctionType">激活函数类型,1:tanh,2:PReLU,3:Sigmoid</param> public CnnFullLayer(int InputCount, int OutputCount, ActivationFunctionTypes activationFunctionType, bool standardization) { this.InputCount = InputCount; this.OutputCount = OutputCount; this.ActivationFunctionType = activationFunctionType; this.Standardization = standardization; InputWeight = new double[OutputCount, InputCount]; OutputOffset = new double[OutputCount]; meanDeltaWeight = new double[OutputCount, InputCount]; meanDeltaOffset = new double[OutputCount]; meanListDeltaWeight = new List <double[, ]>(); meanListDeltaOffset = new List <double[]>(); InitInputWeight(); }
//Called from the neural net, sets the outputs based on node's connections //Used for the hidden layers and final output layer public void SetOutput(ActivationFunctionTypes activationFunctionUsed) { output = 0; //Cycle through all the inputs into this node foreach (var nodeConnection in inputConnections) { //Add them together, including the weighting for each individual node SumInput(nodeConnection); } //Add the node's bias on to outputs output += bias; //Adjust the data so we receive sensible results ActivationTanH(output); }
/// <summary> /// 构造函数 /// </summary> /// <param name="inputWidth"></param> /// <param name="inputHeight"></param> /// <param name="receptiveFieldWidth"></param> /// <param name="receptiveFieldHeight"></param> /// <param name="poolingType">池化类型,1:平均池化(Mean Pooling),2:最大值池化(Max Pooling)</param> public CnnPooling(int inputWidth, int inputHeight, int receptiveFieldWidth, int receptiveFieldHeight, ActivationFunctionTypes activationFunctionType, PoolingTypes poolingType, int inputCount, int outputCount) { this.receptiveFieldWidth = receptiveFieldWidth; this.receptiveFieldHeight = receptiveFieldHeight; this.inputWidth = inputWidth; this.inputHeight = inputHeight; this.ActivationFunctionType = activationFunctionType; this.PoolingType = poolingType; this.InputCount = inputCount; this.OutputCount = outputCount; this.ConvolutionKernelWidth = Convert.ToInt32(Math.Ceiling(inputWidth / (double)receptiveFieldWidth)); this.ConvolutionKernelHeight = Convert.ToInt32(Math.Ceiling(inputHeight / (double)receptiveFieldWidth)); OutputPoolingMax = new int[ConvolutionKernelWidth, ConvolutionKernelHeight]; InitShareWeight(); }