{
/* **** 変更部分 ************************************* */ /* 各素子数の宣言 */ /* 教師信号あり */ #define Tunit 2 /* 音の長さ・高さが与えられる層 */ #define Lunit 0 /* 過去の音が与えられる層(偶数個用意) */ #define Cunit 0 /* ランダムな値が与えられる層 */ /* 教師信号なし */ #define Nunit 23 /* 内部記憶層 */ #define Eunit 0 /* 文脈層 */ #define Filenumber 11 /* ファイル番号 */ #define Inunit ( Tunit + Lunit + Cunit + Nunit + Eunit ) /* 入力層 */ #define Midunit 15 /* 中間層 */ #define Outunit ( Tunit + Lunit + Cunit + Nunit + Eunit ) /* 出力層 */ /* 共通フラグ */ int Quant = 0; /* 量子化するか ( 0 : しない <> それ以外 : する ) */ int Flag_zero = 0; /* 学習 : 第一音目に対する内部記憶層を0にするか 想起 : 内部記憶層部分に0を入れて想起するか */ int Flag_Elman = 0; /* 文脈層を用いた場合のフラグ */ int Flag_NNaibu = 0; /* 内部記憶層の内部記憶層を用いた場合のフラグ */ #ifdef STUDY /* 学習のフラグ */ int Flag_noize = 0; /* 学習時に入力にノイズを与える */ int Flag_gosaplotnew = 0; /* 誤差信号の大きさを測定する */ int Flag_backpro = 3; /* バックプロパゲーションの遅れ回数(default = 3) */ /* 成功のためのフラグ */ int Flag_continue = 1; /* 学習を続けるかどうかのフラグ */ int Flag_success = 0; /* 学習が成功した場合のフラグ */ #endif #ifdef RECALL /* 想起のフラグ */ int Flag_random = 0; /* 内部記憶部分にランダムな値を入れて想起 */ int Flag_inc = 0; /* 音の長さ・高さにノイズを入れる */ int Flag_inout = 0; /* 内部記憶部分で全て0や一つだけ1.0の設定をする */ int Flag_teachcut = 0; /* 音の長さ・高さ部分を入れずに想起 */ int Flag_view = 1; /* 出力結果を画面表示する */ int Flag_weightplot = 1; /* 結合荷重 - 結合荷重特性を測定する */ int Flag_weightsearch = 0; /* 結合荷重の積を測定する */ int Flag_weightplot02 = 1; /* 出力値 - 結合荷重特性を測定する */ int Flag_caos = 0; /* カオスニューロンを用いた想起を行なう */ int Set_zero = 0; /* 部分的に0を入れるための変数 */ int Set_inout = 0; /* 一箇所だけ1.0を入れる */ #endif /***** ここまで **************************************/ /***** 共通変数 **************************************/ #define TL ( Tunit + Lunit ) #define TLC ( Tunit + Lunit + Cunit ) #define TLCN ( Tunit + Lunit + Cunit + Nunit ) /* 時系列の個数 */ #define Smax 256 #define Time 40 /* 量子化レベル */ #define Kaisou ( 10 + 1 ) /* レベル数 */ #define Zoubun 0.1 /* 1レベルの値 */ #define Seed 1 /* 乱数の種 */ #define Bai 1 /* Etaの倍数(内部記憶部分だけ学習を強化させる) */ #define Gakusyu 10000 /* 基本学習回数 */ #define Saidai 1000000 /* 最大学習回数 */ #define Souki 2000 /* 想起回数 */ /* ランダムな値を設定する */ #define Lhigh 1.0 /* 内部記憶の出力値 */ #define Llow 0.0 #define qrand() ( drand48() * ( Lhigh - Llow ) + Llow ) #define Nhigh 0.05 /* 音の長さ */ #define Nlow -0.05 #define lenrand() ( drand48() * ( Nhigh - Nlow ) + Nlow ) #define Hhigh 0.00625 /* 音の高さ */ #define Hlow -0.00625 #define heirand() ( drand48() * ( Hhigh - Hlow ) + Hlow ) #define fsig( in ) ( 1 / ( 1 + exp( -( in ))) ) /* シグモイド関数 */ #define frev( in ) ( log( ( in ) / ( in - 1 ) ) ) /* 音の長さの関数 */ /* 結合荷重 */ double wim[Midunit][Inunit]; /* 入力層〜中間層 */ double wmo[Outunit][Midunit]; /* 中間層〜出力層 */ /* 閾値 */ double sikiiim[Midunit]; /* 中間層素子 */ double sikiimo[Outunit]; /* 出力層素子 */ /* 各入出力値 */ double inout[Inunit][Time]; /* 入力層へ入力される */ double midout[Midunit]; /* 中間層へ入力される */ double outout[Outunit]; /* 出力層から出力される */ int tsmax; /* 実際の時系列の長さ */ int k; /* 計算回数の変数 */ int kk; /* 計算回数の最大 */ int t; /* 現在の時間の変数 */ int r; /* 現在の計算回数の合計 */ double inkeep[Inunit][Time]; /* 実際に教師信号が入る */ double outkeep[Outunit]; /* 出力値を保持する */ char *Data = "saita"; /* 教師信号ファイル名 */ char *fi_weight = NULL; char fiplot[Smax]; char fisong[Smax]; char finaibu[Smax]; FILE *fpplot; FILE *fpsong; FILE *fpnaibu; /***** 学習に使う変数 **************************************/ #ifdef STUDY double Eta = 0.5; /* 学習係数 */ double Alpha = 0.005; /* 加速項 */ double Eta2; /* 内部記憶部分に与えられる学習係数 */ /* 各層重みの変化分 */ double dwim[Midunit][Inunit]; double dwmo[Outunit][Midunit]; /* 伝搬される誤差信号 */ double dim[Midunit]; double dmo[Outunit]; /* しきい値の変化分 */ double dsikiiim[Midunit]; double dsikiimo[Outunit]; /* 結合荷重をランダムで決める */ #define Rhigh 0.30 #define Rlow -0.30 #define urand() ( drand48() * ( Rhigh - Rlow ) + Rlow ) double midkeep[Midunit]; /* t-1 の中間層への入力 */ double midkeep2[Midunit]; /* t-2 の中間層への入力 */ double midkeep3[Midunit]; /* t-3 の中間層への入力 */ double outkept[Outunit][Time]; double outkeep2[Outunit]; double outkeep3[Outunit]; double gosa[Outunit][Time]; double kekka[Outunit]; double cyclekeep[Inunit][Time]; double noisein[Tunit][Time]; double gosakeep[Tunit]; double gosasumcloseteach , gosasumcloseall; double gosasumopenteach , gosasumopenall; double dmoteach[TLC]; double dmonaibu[Nunit]; double dimlate[Midunit] , dimlate2[Midunit]; /* 誤差信号 */ double dimget[Midunit]; int chsuccess,chfault; FILE *fi; FILE *fprecall; FILE *fpin; FILE *fpnaibucheck; FILE *fpnaibu2,*fpnaibu4; FILE *fpout; FILE *fpfirst; FILE *fpsumplot; FILE *fpdimplot; char figosa[Smax]; char firecall[Smax]; char fiin[Smax]; char finaibucheck[Smax]; char finaibu2[Smax],finaibu4[Smax]; char fiout[Smax]; char fifirst[Smax]; char fisumplot[Smax]; char fidimplot[Smax]; #endif /****** 想起に使う変数 *************************************/ #ifdef RECALL double song[Tunit][Time]; double songkeep[Tunit][Time]; double Noize; double em[Midunit] , old_em[Midunit]; double zm[Midunit] , old_zm[Midunit]; double km , kr , al; double old_midout[Midunit]; int over , under; char fiweight_tm[Smax]; char fiweight_nm[Smax]; char fiweight_mt[Smax]; char fiweight_mn[Smax]; FILE *fpweight_tm; FILE *fpweight_nm; FILE *fpweight_mt; FILE *fpweight_mn; char fiweight02_tm[Smax]; char fiweight02_nm[Smax]; char fiweight02_mt[Smax]; char fiweight02_mn[Smax]; FILE *fpweight02_tm; FILE *fpweight02_nm; FILE *fpweight02_mt; FILE *fpweight02_mn; #endif