/// <summary>Инициализация новой многослойной нейронной сети</summary> /// <param name="InputsCount">Количество входов сети</param> /// <param name="NeuronsCount">Количество нейронов в слоях</param> /// <param name="Initialize">Функция инициализации коэффициентов матриц передачи слоёв</param> public MultilayerPerceptron( int InputsCount, [NotNull] IEnumerable <int> NeuronsCount, [CanBeNull] NetworkCoefficientInitializer Initialize = null) : this(CreateLayersMatrix(InputsCount, NeuronsCount, Initialize ?? GetStandardRandomInitializer())) { }
/// <summary>Инициализация матрицы весовых коэффициентов слоя</summary> /// <param name="LayerWeights">Матрица весовых коэффициентов слоя</param> /// <param name="LayerIndex">Индекс слоя</param> /// <param name="Initializer">Функция инициализации весовых коэффициентов слоя</param> private static void InitializeLayerWeightsMatrix( [NotNull] double[,] LayerWeights, int LayerIndex, [NotNull] NetworkCoefficientInitializer Initializer) { for (var i = 0; i < LayerWeights.GetLength(0); i++) { for (var j = 0; j < LayerWeights.GetLength(1); j++) { LayerWeights[i, j] = Initializer.Invoke(LayerIndex, i, j); } } }
private static double[][,] CreateLayersMatrix( int InputsCount, [NotNull] IEnumerable <int> NeuronsCount, [NotNull] NetworkCoefficientInitializer Initialize) { var neurons_count = NeuronsCount.ToArray(); var layers_count = neurons_count.Length; var weights = new double[layers_count][, ]; var w = new double[neurons_count[0], InputsCount]; weights[0] = w; InitializeLayerWeightsMatrix(w, 0, Initialize); for (var layer = 1; layer < layers_count; layer++) { w = new double[neurons_count[layer], neurons_count[layer - 1]]; weights[layer] = w; InitializeLayerWeightsMatrix(w, layer, Initialize); } return(weights); }