/// <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); } }
public void ConnectTo(Layer2D inputLayer, KernelParams kernel) { var inputsCounter = 0; ConnectWithoutBiasTo(inputLayer, kernel, ref inputsCounter); ConnectLastToBias(); }
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 }; }