Пример #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;
        }
Пример #2
0
        public void ConnectTo(ConvolutionalLayer inputLayer, KernelParams kernel)
        {
            // поочередно подключаем карту к каждой карте входного слоя,
            var inputsCounter = 0;
            foreach (var featureMap in inputLayer.FeatureMaps)
                ConnectWithoutBiasTo(featureMap, kernel, ref inputsCounter);

            ConnectLastToBias();
        }
Пример #3
0
        public ConvolutionalLayer(int mapsCount, int mapWidth, int mapHeight, int inputsPerNeuron, KernelParams kernel)
        {
            // инициализаци¤ вручную. —оздаетс¤ пустой слой, затем карты признаков и из них копируютс¤ ссылки на нейроны и весы самого сло¤
            FeatureMaps = new FeatureMap[mapsCount];
            Neurons = new Neuron[mapWidth*mapHeight*mapsCount];
            Weights = new Weight[inputsPerNeuron*mapsCount];

            for (int fi = 0, w = 0, n = 0; fi < FeatureMaps.Length; fi++)
            {
                // создаем очередную карту признаков - 2D слой
                FeatureMaps[fi] = new FeatureMap(mapWidth, mapHeight, inputsPerNeuron);

                // заполн¤ем из новой карты признаков основные массивы сло¤ - нейроны и веса
                foreach (var neuron in FeatureMaps[fi].Neurons)
                    Neurons[n++] = neuron;
                foreach (var weight in FeatureMaps[fi].Weights)
                    Weights[w++] = weight;
            }

            _kernel = kernel;
        }
Пример #4
0
 public void ConnectTo(Layer2D inputLayer, KernelParams kernel)
 {
     var inputsCounter = 0;
     ConnectWithoutBiasTo(inputLayer, kernel, ref inputsCounter);
     ConnectLastToBias();
 }