next up previous contents
Next: 付録D 曲データを周波数に変換するプログラム Up: 無題 Previous: 付録B 学習プログラム(内部記憶を持つニューラルネットワーク)

付録C 曲を想起させるプログラム

/* 学習後のパラメータをニューロンの出力を計算するプログラム : pout.c */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#define Iunits  20
#define Hunits  50
#define Ounits  2
#define SMAX    256
#define fout(x) ( 1 / ( 1 + exp( -(x) ) ))      /* シグモイド関数 */

int     iunits = Iunits;

double wih[Hunits][Iunits];   /* 結合荷重(重み) */
double who[Ounits][Hunits];

double dwih[Hunits][Iunits];  /*  重みの変化量  */
double dwho[Ounits][Hunits];

double shikiih[Hunits];       /*    しきい値    */
double shikiio[Ounits];

double dshikiih[Hunits];      /* しきい値の変化量 */
double dshikiio[Ounits];

double iout[Iunits];          /*    各層の出力  */
double hout[Hunits], old_hout[Hunits];
double oout[Ounits];

double ts[SMAX];              /*    教師信号    */       

double em[Hunits], old_em[Hunits];      /* 内部状態(イータ、ゼータ)*/
double zm[Hunits], old_zm[Hunits];

double km, kr, al;           /* カオスニューロンのパラメータ */

void load_prm(char *filename){
  FILE *fi;
  size_t wsize;
  int i;

  if(( fi = fopen(filename,"r")) == NULL ){
    fprintf(stderr,"Can't open %s\n",filename);
    exit(1);
  }

  wsize = sizeof( double );

  /* データーの読み込み */
  fread( wih , wsize , Iunits * Hunits , fi );
  fread( who , wsize , Hunits * Ounits , fi );
  fread( shikiih , wsize , Hunits , fi );
  fread( shikiio , wsize , Ounits , fi );
  fclose(fi);
}

/* フォワードプロパゲーション */
void foward_propagation(){
  int i,j;
  double sum;

  for( i = 0 ; i < Hunits ; i++ ){
    sum = 0;
    for( j = 0 ; j < Iunits ; j++ ){
      sum += wih[i][j] * iout[j];
    }
    old_em[i] = em[i];
    em[i] = km * old_em[i] + sum;
    old_zm[i] = zm[i];
    old_hout[i] = hout[i];
    zm[i] = kr * zm[i] - al * old_hout[i];
    hout[i] = fout( em[i] + zm[i] + shikiih[i] );
  }
  for( i = 0 ; i < Ounits ; i++ ){
    sum = 0;
    for( j = 0 ; j < Hunits ; j++ ){
      sum += who[i][j] * hout[j];
    }
    oout[i] = sum + shikiio[i];
  }
}

double fl( double x ){
  return( -log(x)/(M_LN2 * 5) +1 );
}

double lenseik( double len ){
  if( len <= ( fl(12) - fl(16) )/2 + fl(16) ){
    return( fl(16) );
  }else if( len <= ( fl(8)-fl(12) )/2 + fl(12) ){
    return( fl(12) );
  }else if( len <= ( fl(6) - fl(8) )/2 + fl(8) ){
    return( fl(8) );
  }else if( len <= ( fl(4) - fl(6) )/2 + fl(6) ){
    return( fl(6) );
  }else if( len <= ( fl(3) - fl(4) )/2 + fl(4) ){
    return( fl(4) );
  }else if( len <= ( fl(2) - fl(3) )/2 + fl(3) ){
    return( fl(3) );
  }else if( len <= ( fl(1.5) - fl(2) )/2 + fl(2) ){
    return( fl(2) );
  }else if( len <= ( 1 - fl(1.5) )/2 + fl(1.5) ){
    return( fl(1.5) );
  }else if( len <= 1 ){
    return(1);
  }
}

double pitseik(double pit){
  int p;
  pit *= 40.0;
  p = rd(pit);
  return( (double)p/40 );
}

int rd( double a ){
  char buf[10],*s;
  int b;

  sprintf(buf, "%lf", a);

  s = strchr(buf, '.');
  if( s == NULL ) return( (int)a );
  s++;

  if( *s-'0'<4 ) b = a;
  else           b = a+1;

  return(b);
}

main( int argc, char *argv[] ){
  int i,j,k;
  int n;
  char name[64],buf[256];
  FILE *fp;

  if( argc !=  7 ){
    fprintf(stderr, "usage: pout filename n nin km kr al\n");
    exit(1);
  }

  n = atoi( argv[2] );
  iunits = atoi( argv[3] )*2;
  load_prm( argv[1] );
  km = atof( argv[4] );
  kr = atof( argv[5] );
  al = atof( argv[6] );

  i = 0;
  while( fscanf(stdin, "%lf %lf", &ts[i], &ts[i+1]) == 2 )
    i += 2;

  i = i - Iunits;

  for( j = i , k = 0 ; j < i + Iunits ; j += 2 ){
    iout[k] = ts[j];
    iout[k+1] = ts[j+1];
    k += 2;
  }

  /* ファイルの作成 */
  sprintf(name,"Km%0.5f_Kr%0.5f_A%0.5f.data",km,kr,al);
  fp = fopen(name,"w");
  if( fp == NULL ){
    fprintf(stderr,"error\n");
    exit(1);
  }
  
  for( i = 0 ; i < n ; i++ ){
    foward_propagation();
    oout[0] = lenseik( oout[0] );
    oout[1] = pitseik( oout[1] );
    for( j = 0 ; j < Iunits - 2 ; j += 2 ){
      iout[j] = iout[j+2];
      iout[j+1] = iout[j+3];
    }
    iout[j] = oout[0];
    iout[j+1] = oout[1];

    /* ファイルに出力 */    
    fprintf(fp,"%lf %lf\n", oout[0], oout[1]);

  }
  fclose(fp);
}



Deguchi Toshinori
Thu Jul 13 11:47:42 JST 2000