public static float NextFloat(this IRnd rnd, float a, float b) { return(a + rnd.NextFloat() * (b - a)); }
// создаем выходные связи для нейрона (рандомно) private List <NRelation> _createOutputForNeuron(int x, int y, int z) { if (NEED_STAT_WEIGHT) { MinWeight = 0; MaxWeight = 0; } var output = new List <NRelation>(); // по оси Z распределение норм тут не надо замыкать последний слой на первый var minZ = z - MAX_DEEP_RELATIONS_Z; if (minZ < 1) { minZ = 1; } var maxZ = z + MAX_DEEP_RELATIONS_Z; if (maxZ > LenZ - 1) { maxZ = LenZ - 1; } // а вот по икс и игрек хотелось бы замкнуть первые нейроны на последние var minY = y - maxDeepRelationsY; /*if (minY < 0) minY = 0;*/ var maxY = y + maxDeepRelationsY; // if (maxY > LenY - 1) maxY = LenY - 1; var minX = x - maxDeepRelationsX; /*if (minX < 0) minX = 0;*/ var maxX = x + maxDeepRelationsX; // if (maxX > LenX - 1) maxX = LenX - 1; /*if (z==0 && y==1 && x==2) * _logger.LogInformation(2111, "NNet _createOutputForNeuron {x}-{xx} {y}-{yy} {z}-{zz}", minX, maxX, minY, maxY, minZ, maxZ); * /**/ for (var zz = minZ; zz <= maxZ; zz++) // первый слой входы (входы исключительно на другие слои) { for (var yy = minY; yy <= maxY; yy++) { for (var xx = minX; xx <= maxX; xx++) { // замыкания по оси икс и игрек var yyy = yy; var xxx = xx; if (yy < 0) { yyy = LenY + yy; } if (yy > LenY - 1) { yyy = yy - (LenY); } if (xx < 0) { xxx = LenX + xx; } if (xx > LenX - 1) { xxx = xx - (LenX); } // связь на себя не допускаем, тока косвенная - через другие нейроны if (x == xxx && yyy == y && z == zz) { continue; } var coords = new NCoords(xxx, yyy, zz); var o = new NRelation() { Neuron = coords.ToSingle(LenX, LenY), Weight = _rand.NextFloat(MIN_INIT_WEIGHT, MAX_INIT_WEIGHT), WeightChange = 0 }; if (NEED_STAT_WEIGHT) { // здесь не надо юзать WeightSum так как WeightChange==0 if (MinWeight > o.Weight) { MinWeight = o.Weight; } if (MaxWeight < o.Weight) { MaxWeight = o.Weight; } } /*if (z == 0 && y == 1 && x == 2) * { * _logger.LogInformation(1111, "NNet _createOutputForNeuron for ({x}, {y}, {z}) => {n} ({xx}, {yy}, {zz})", x, y, z, (new NCoords(xxx, yyy, zz)).ToSingle(LenX, LenY), xxx, yyy, zz); * }/**/ o.SetNeuron(Neurons[zz][yyy][xxx]); output.Add(o); } } } return(output); }