//обновляет массив сигналов значениями из массива чисел public static void InsertFloats(Signal[] signalsDst_, float[] floatsSrc_) { if (floatsSrc_.Length != signalsDst_.Length) throw new Exception("floats_src.Length!=signals_dst.Length"); for (int i = 0, c = signalsDst_.Length; i < c; i++) signalsDst_[i].Value = floatsSrc_[i]; }
//возвращает массив пустых сигналов public static Signal[] GetSignalArr(int len_) { var res = new Signal[len_]; for (int i = 0, c = res.Length; i < c; i++) res[i] = new Signal(); return res; }
//переводит сигналы в обычный массив чисел public static float[] ConvertSignals(Signal[] signals_) { var res = new float[signals_.Length]; for (int i = 0, c = signals_.Length; i < c; i++) res[i] = signals_[i].Value; return res; }
//СОЕДИНЕНИЕ С ИСТОЧНИКАМИ СИГНАЛОВ //пересоединяет нейрон с указанными источниками сигнала public void Reconnect(Signal[] signals_) { Dendrites = new Dendrite[signals_.Length]; var weightMagnitude = 10f / (signals_.Length + 1); //соединяем с небольшими случайными весами for (int i = 0, c = signals_.Length; i < c; i++) { Dendrites[i] = new Dendrite() { Signal = signals_[i], Weight = GetRandomWeight(weightMagnitude) }; } BiasDendrite = new Dendrite() { Signal = NNHelper.UnitSignal, Weight = GetRandomWeight(weightMagnitude) }; }
internal float dy_ds; //производная выходного значения нейрона по взвешенной сумме его входов #endregion Fields #region Constructors public Neuron() { Output = new Signal { SourceNeuron = this }; }
//СОЕДИНЕНИЕ НЕЙРОНОВ В СЛОЯХ //соединяет указанный нейрон с указанными сигналами предыдущего слоя или со всеми сигналами, если specific_target_neurons==null public void ConnectNeuron(int layer_ind, int neuron_ind, List<int> specific_input_signals) { var neuron = Layers[layer_ind].Neurons[neuron_ind]; Signal[] signals_ = null, signals = null; if (layer_ind == 0) signals_ = InputSignals; else signals_ = Array.ConvertAll(Layers[layer_ind - 1].Neurons, n => n.Output); if (specific_input_signals == null) { //полное подсоединение signals = signals_; } else { int c = specific_input_signals.Count; signals = new Signal[c]; for (int i = 0; i < c; i++) { //частичное подсоединение int k = specific_input_signals[i]; signals[i] = signals_[k]; } } neuron.Reconnect(signals); }