/// <summary>
 /// 入力層・中間層・出力層のインスタンスを新規に生成するとともに、全ユニットを初期化する
 /// </summary>
 public void Init()
 {
     this.layer = new Layer(this.parameter, this.parameter.TotalLayer - 1);
     this.layer.LearningCoefficient = this.parameter.LearningCoefficient;
     return;
 }
 // 3層以上と限定すれば、numOfPreLayerUnitは要らないんだけど2層も試したかったので導入した
 /// <summary>
 /// レイヤークラスのコンストラクタ
 /// <para>このクラスインスタンスを一つ生成すれば、入力層から出力層までを表現可能です。</para>
 /// <para>
 /// 本クラスを生成する際、numOfPreLayerUnitは0と設定することをお勧めします。
 /// 0でなくともエラーは出ませんが、入力層には結合係数が定義されないためです。
 /// </para>
 /// </summary>
 /// <param name="_parameter">ニューラルネットのパラメータ</param>
 /// <param name="_myLayerNum">層番号</param>
 /// <param name="numOfPreLayerUnit">前の層のユニット数(省略可能です。デフォルトでは0となります。)</param>
 public Layer(Parameter _parameter, int _myLayerNum, int numOfPreLayerUnit = 0)
 {
     this.parameter = _parameter;
     this.grossLayerNum = this.parameter.TotalLayer;
     this.myLayerNum = _myLayerNum;
     // ユニットの準備と、前層のユニット数を記憶する
     switch (this.MyKind)
     {
         case Kind.InputLayer:                                                       // 入力層
             this.units = new Unit[this.parameter.NumOfUnitInInputLayer];            // 層の種類に合わせて、ユニット数を宣言する
             break;
         case Kind.HiddenLayer:                                                      // 中間層
             this.units = new Unit[this.parameter.NumOfUnitInHiddenLayer];
             break;
         case Kind.OutputLayer:                                                      // 出力層
             this.units = new Unit[this.parameter.NumOfUnitInOutputLayer];
             break;
     }
     for (int i = 0; i < this.units.Length; i++) this.units[i] = new Unit(numOfPreLayerUnit);        // 前の層のユニット数だけ結合係数を生成させる
     this.preLayerUnitNum = numOfPreLayerUnit;                                                       // 前の層のユニット数を記憶しておく
     if (this.MyKind != Kind.OutputLayer)
         this.subsidiaryLayer = new Layer(this.parameter, this.myLayerNum - 1, this.units.Length);   // 出力層以外なら子レイヤを生成
 }