Example #1
0
        /// <summary>
        /// Присоединяет карту к двумерному массиву нейронов без биаса.
        /// Так как карт может быть несколько, передается переменная-счетчик подключений карты
        /// </summary>
        /// <param name="inputMap"></param>
        /// <param name="kernel"></param>
        /// <param name="inputsCounter"></param>
        private void ConnectWithoutBiasTo(Layer2D inputMap, KernelParams kernel, ref int inputsCounter)
        {
            // заполнение карты слоя
            for (var mapY = 0; mapY < Height; mapY++)
            {
                for (var mapX = 0; mapX < Width; mapX++)
                {
                    // обрабатываемый нейрон
                    var neuron = Neurons2D[mapY][mapX];

                    var i = 0;

                    // обрабатываем ядро 5*5, заполняя соединения
                    // начало ядра перемещается по 2 пиксела вправо и вниз для каждой карты
                    for (var kY = mapY*kernel.Step; kY < mapY*kernel.Step + kernel.Height; kY++)
                    {
                        for (var kX = mapX*kernel.Step; kX < mapX*kernel.Step + kernel.Width; kX++)
                        {
                            // подключаем нейрон с предыдущего слоя через ядро весов
                            var inputNeuron = inputMap.Neurons2D[kY][kX];
                            var weight = Weights[inputsCounter + i];
                            neuron.InputConnections[inputsCounter + i] = new InputConnection(inputNeuron, weight);
                            i++;
                        }
                    }
                }
            }

            // присоединен еще один входной слой
            inputsCounter += kernel.Length;
        }
 /// <summary>
 /// ќбеспечивает соединение каждой карты признаков со входным 2D-слоем.
 /// </summary>
 /// <param name="inputLayer">¬ходной сверточный 2D-слой.</param>
 public void ConnectTo(Layer2D inputLayer)
 {
     // каждую карту признаков подключаем к входному слою
     foreach (var featureMap in FeatureMaps)
     {
         featureMap.ConnectTo(inputLayer, _kernel);
     }
 }
Example #3
0
 public void ConnectTo(Layer2D inputLayer, KernelParams kernel)
 {
     var inputsCounter = 0;
     ConnectWithoutBiasTo(inputLayer, kernel, ref inputsCounter);
     ConnectLastToBias();
 }
Example #4
0
        public Network()
        {
            // 0 слой - входной входных соединений нет
            InputLayer = new Layer2D(InputImageWidth, InputImageHeight, 0, 0);

            // 1 слой - сверточный, 156 весов, 26364 входных соединений
            var layer1 = new ConvolutionalLayer(L1MapsCount, L1MapWidth, L1MapHeight, L1InputsPerNeuron, Kernel);
            layer1.ConnectTo(InputLayer);

            // 2 слой - сверточный, 7550 весов, 188750 входных соединений
            var layer2 = new ConvolutionalLayer(L2MapsCount, L2MapWidth, L2MapHeight, L2InputsPerNeuron, Kernel);
            layer2.ConnectTo(layer1);

            // 3 слой - полносвязный, 125100 весов, 125100 соединений
            var layer3 = new Layer(L3NeuronsCount, L3InputsPerNeuron);
            layer3.ConnectTo(layer2);

            // 4 слой - полносвязный, 1010 весов, 1010 соединений
            OutputLayer = new Layer(L4NeuronsCount, L4InputsPerNeuron);
            OutputLayer.ConnectTo(layer3);

            for (int y = 0, n = 0; y < InputLayer.Height; y++)
            {
                for (var x = 0; x < InputLayer.Width; x++, n++)
                {
                    Debug.Assert(InputLayer.Neurons[n] == InputLayer.Neurons2D[y][x],
                                 string.Format("n => y, x: {0} => {1}, {2}", n, y, x));
                }
            }

            Layers = new[] { InputLayer, layer1, layer2, layer3, OutputLayer };
        }