Exemplo n.º 1
0
        /// <summary>
        /// Инициализация реальной схемы.
        /// </summary>
        /// <param name="filterMatrixSize">Размер матриц фильтра.</param>
        /// <param name="poolingMatrixSize">Размер пуллинговых матриц.</param>
        private Dictionary <int, List <Layer> > InitializeRealScheme(int filterMatrixSize, int poolingMatrixSize)
        {
            var realScheme    = new Dictionary <int, List <Layer> >();
            var virtualScheme = _topology.GetScheme();

            var firstValue = _dataSet.GetDataSetForNumber().First().Value.First();

            foreach (var pair in virtualScheme)
            {
                var virtualElements = pair.Value;
                var realElements    = new List <Layer>();

                var index = 0;
                foreach (var layerType in virtualElements)
                {
                    Layer element = null;

                    switch (layerType)
                    {
                    case LayerType.Input:
                        element = new InputLayer(firstValue);
                        element.Initialize(NetworkModeType.Learning);
                        break;

                    case LayerType.Convolution:
                        var previousKey = pair.Key - 1;

                        var previousElements = realScheme[previousKey];
                        var previousType     = virtualScheme[previousKey].First();

                        if (previousElements.Count != virtualElements.Count &&
                            previousType.Equals(LayerType.Input))
                        {
                            var previousElement = previousElements.FirstOrDefault() as InputLayer;

                            if (previousElement is null)
                            {
                                throw new Exception("Предыдущий слой оказался Null!");
                            }

                            var map = previousElement.GetData(LayerReturnType.Map);
                            element = new ConvolutionLayer(map, filterMatrixSize);
                            element.Initialize(NetworkModeType.Learning);
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        break;

                    case LayerType.Subsampling:
                        previousKey = pair.Key - 1;

                        previousElements = realScheme[previousKey];
                        previousType     = virtualScheme[previousKey][index];

                        if (previousElements.Count == virtualElements.Count &&
                            previousType.Equals(LayerType.Convolution))
                        {
                            var previousElement = previousElements[index] as ConvolutionLayer;

                            if (previousElement is null)
                            {
                                throw new Exception("Предыдущий слой оказался Null!");
                            }

                            var map = previousElement.GetData(LayerReturnType.Map);
                            element = new SubsamplingLayer(map, poolingMatrixSize);
                            element.Initialize(NetworkModeType.Learning);
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        break;

                    case LayerType.Hidden:
                        previousKey = pair.Key - 1;

                        previousElements = realScheme[previousKey];
                        previousType     = virtualScheme[previousKey][index];

                        if (previousElements.Count == virtualElements.Count &&
                            previousType.Equals(LayerType.Subsampling))
                        {
                            var previousElement = previousElements[index] as SubsamplingLayer;

                            if (previousElement is null)
                            {
                                throw new Exception("Предыдущий слой оказался Null!");
                            }

                            var neurons = previousElement.GetData(LayerReturnType.Neurons) as List <NeuronFromMap>;
                            element = new HiddenLayer(neurons);
                            element.Initialize(NetworkModeType.Learning);
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        break;

                    case LayerType.Output:
                        previousKey = pair.Key - 1;

                        previousElements = realScheme[previousKey];
                        previousType     = virtualScheme[previousKey][index];

                        if (previousElements.Count > virtualElements.Count &&
                            previousType.Equals(LayerType.Hidden))
                        {
                            var neurons = new List <Neuron>();

                            foreach (var elementInLastLayer in previousElements)
                            {
                                var previousElement = elementInLastLayer as HiddenLayer;

                                if (previousElement is null)
                                {
                                    throw new Exception("Предыдущий слой оказался Null!");
                                }

                                var data = previousElement.GetData(LayerReturnType.Neurons) as List <NeuronFromMap>;
                                neurons.AddRange(data);
                            }

                            var outputs = neurons.Select(neuron => neuron.Output).ToList();

                            element = new OutputLayer(outputs);
                            element.Initialize(NetworkModeType.Learning);
                        }
                        else
                        {
                            throw new NotImplementedException();
                        }
                        break;

                    default:
                        throw new Exception("Неизвестный тип слоя!");
                    }

                    realElements.Add(element);
                    ++index;
                }

                realScheme.Add(pair.Key, realElements);
            }

            return(realScheme);
        }