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