//適当な値の配列を作る public static void GetRealArray(Real[] result, Real max = 1, Real min = 0) { for (int i = 0; i < result.Length; i++) { result[i] = (max - min) * Broth.Random() - min; } }
//初期値が入力されなかった場合、この関数で初期化を行う public static void InitHeNorm(NdArray <Real> array, Real masterScale = 1) { Real s = masterScale * Math.Sqrt(2.0f / array.Length); for (int i = 0; i < array.Data.Length; i++) { array.Data[i] = Broth.RandomNormal(s); } }
public static void InitXavier(NdArray <Real> array) { Real fanOut = array.Shape.Length > 1 ? array.Shape[array.Shape.Length - 2] : array.Shape[array.Shape.Length - 1]; Real fanIn = array.Shape[array.Shape.Length - 1]; Real n = (fanIn + fanOut) / 2.0f; Real limit = Math.Sqrt(3.0f / n); for (int i = 0; i < array.Data.Length; i++) { array.Data[i] = (limit * 2.0f) * Broth.Random() - limit; } }
// 平均mu, 標準偏差sigmaの正規分布乱数を得る。Box-Muller法による。 public static Real RandomNormal(Real sigma = 1, Real mu = 0) { Real boxMuller2; if (!_flip) { _beta = Broth.Random() * Math.PI * 2; _boxMuller1 = Math.Sqrt(-2 * Math.Log(Broth.Random())); boxMuller2 = Math.Sin(_beta); } else { boxMuller2 = Math.Cos(_beta); } _flip = !_flip; return(sigma * _boxMuller1 * boxMuller2 + mu); }
// 平均mu, 標準偏差sigmaの正規分布乱数を得る public static Real RandomNormal(Real sigma = 1, Real mu = 0) { Real boxMuller = Math.Sqrt(-2 * Math.Log(Broth.Random())) * Math.Sin(2 * Math.PI * Broth.Random()); return(sigma * boxMuller + mu); }