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); }