Ejemplo n.º 1
0
        public static IConvLayer ToConvLayer(this CnnLayer layer)
        {
            switch (layer.LayerType)
            {
            case (byte)LayerType.CovolutionalLayer:
                var convLayer = new ConvolutionalLayer
                {
                    Kernels       = new List <double[][][]>(),
                    KernelPadding = 0,
                    KernelStride  = 1,
                    KernelSize    = layer.KernelHeight
                };

                var weights = layer.Weights.Weights.Split(';');
                for (int i = 0; i < layer.KernelsCount; ++i)
                {
                    var kernels = new double[layer.FeatureMapsCountIn][][];

                    for (int j = 0; j < layer.FeatureMapsCountIn; ++j)
                    {
                        kernels[j] = new double[layer.KernelHeight][];

                        for (int a = 0; a < layer.KernelHeight; ++a)
                        {
                            kernels[j][a] = new double[layer.KernelWidth];

                            for (int b = 0; b < layer.KernelWidth; ++b)
                            {
                                kernels[j][a][b] =
                                    double.Parse(weights[j * layer.KernelHeight * layer.KernelWidth + a * layer.KernelWidth + b]);
                            }
                        }
                    }

                    convLayer.Kernels.Add(kernels);
                }
                return(convLayer);

            case (byte)LayerType.PoolingLayer:
                var poolingLayer = new PollingLayer(layer.KernelHeight, 0, 1);

                return(poolingLayer);

            case (byte)LayerType.ReluLayer:
                var reluLayer = new ReLuLayer();

                return(reluLayer);

            default:
                throw new Exception();
            }
        }
        private Guid ProcessSave(CNN network, string name, NetworkContext context)
        {
            var cnnModel = new CnnModel
            {
                CnnModelId = Guid.NewGuid()
            };
            var layers     = new List <CnnLayer>();
            var cnnWeights = new List <CnnWeights>();

            for (int i = 0; i < network.LayersCount; i++)
            {
                if (network.Layers[i] is ConvolutionalLayer)
                {
                    var cnnLayer = network.Layers[i] as ConvolutionalLayer;
                    var layer    = new CnnLayer
                    {
                        CnnLayerId         = Guid.NewGuid(),
                        PositionIn         = i,
                        KernelHeight       = cnnLayer.KernelSize,
                        KernelWidth        = cnnLayer.KernelSize,
                        KernelsCount       = cnnLayer.KernelsCount,
                        FeatureMapsCountIn = cnnLayer.KernelDepth,
                        LayerType          = (byte)LayerType.CovolutionalLayer,
                        Model = cnnModel
                    };

                    var weights = new CnnWeights
                    {
                        CnnWeightsId = Guid.NewGuid(),
                        Layer        = layer,
                        LayerId      = layer.CnnLayerId
                    };

                    var w       = string.Empty;
                    var builder = new StringBuilder(String.Empty);
                    for (int j = 0; j < cnnLayer.KernelsCount; ++j)
                    {
                        for (int k = 0; k < cnnLayer.KernelDepth; ++k)
                        {
                            for (int a = 0; a < cnnLayer.Kernels[j][k].Length; ++a)
                            {
                                for (int b = 0; b < cnnLayer.Kernels[j][k][a].Length; ++b)
                                {
                                    builder.Append(cnnLayer.Kernels[j][k][a][b] + ";");
                                }
                            }
                        }
                    }

                    w = builder.ToString();
                    weights.Weights = w;
                    cnnWeights.Add(weights);

                    layer.Weights = weights;

                    layers.Add(layer);
                }
                else if (network.Layers[i] is PollingLayer)
                {
                    var cnnLayer = network.Layers[i] as PollingLayer;
                    var layer    = new CnnLayer
                    {
                        CnnLayerId   = Guid.NewGuid(),
                        PositionIn   = i,
                        KernelHeight = cnnLayer.KernelSize,
                        KernelWidth  = cnnLayer.KernelSize,
                        LayerType    = (byte)LayerType.PoolingLayer,
                        Model        = cnnModel
                    };

                    layers.Add(layer);
                }
                else
                {
                    var cnnLayer = network.Layers[i] as ReLuLayer;
                    var layer    = new CnnLayer
                    {
                        CnnLayerId   = Guid.NewGuid(),
                        PositionIn   = i,
                        KernelHeight = cnnLayer.KernelSize,
                        KernelWidth  = cnnLayer.KernelSize,
                        LayerType    = (byte)LayerType.ReluLayer,
                        Model        = cnnModel
                    };

                    layers.Add(layer);
                }
            }

            var l = new CnnLayer
            {
                CnnLayerId   = Guid.NewGuid(),
                KernelHeight = network.FlattenLayer.KernelSize,
                KernelWidth  = network.FlattenLayer.KernelSize,
                LayerType    = (byte)LayerType.FlattenLayer,
                Model        = cnnModel
            };

            layers.Add(l);

            cnnModel.Layers = layers;

            var perceptronModel = new PerceptronModel
            {
                PerceptronModelId = Guid.NewGuid()
            };
            var percLayers  = new List <PerceptronLayer>();
            var percWeights = new List <PerceptronWeights>();

            for (var i = 0; i < network.Perceptron.LayersCount; ++i)
            {
                var layer = network.Perceptron.Layers[i];

                var perLayer = new PerceptronLayer
                {
                    PerceptronLayerId = Guid.NewGuid(),
                    NeuronsCount      = layer.NeuronsCount,
                    PositionIn        = i,
                    Perceptron        = perceptronModel
                };

                var weights = new PerceptronWeights
                {
                    PerceptronWeightsId = perLayer.PerceptronLayerId,
                    Height = layer.WeightRowsCount,
                    Width  = layer.WeightColumnsCount
                };

                string w       = String.Empty;
                var    builder = new StringBuilder(String.Empty);
                for (int a = 0; a < layer.Weights.Length; ++a)
                {
                    for (int b = 0; b < layer.Weights[a].Length; ++b)
                    {
                        builder.Append(layer.Weights[a][b] + ";");
                    }
                }

                w = builder.ToString();

                weights.Weights = w;
                percWeights.Add(weights);

                percLayers.Add(perLayer);
            }

            perceptronModel.Layers = percLayers;

            //save
            var networkModel = new NetworkModel
            {
                NetworkModelId = Guid.NewGuid(),
                Perceptron     = perceptronModel,
                PerceptronId   = perceptronModel.PerceptronModelId,
                Cnn            = cnnModel,
                CnnId          = cnnModel.CnnModelId,
                Name           = name
            };

            cnnModel.NetworkModel   = networkModel;
            cnnModel.NetworkModelId = networkModel.NetworkModelId;

            perceptronModel.NetworkModel   = networkModel;
            perceptronModel.NetworkModelId = networkModel.NetworkModelId;

            context.NetworkModels.Add(networkModel);

            context.CnnLayers.AddRange(layers);
            context.CnnWeightsSet.AddRange(cnnWeights);
            context.CnnModels.Add(cnnModel);

            context.PerceptronLayers.AddRange(percLayers);
            context.PerceptronWeights.AddRange(percWeights);
            context.PerceptronModels.Add(perceptronModel);


            context.SaveChanges();

            return(networkModel.NetworkModelId);
        }