>dho[i] = signal[i] - oout[i]; //出力層の誤差の計算(出力はシグモイド関数にかけてない)
そもそもこれが許されてるのかどうか俺は知らんのだが、

>dih[i] = hout[i] * ( 1 - hout[i] ) * sum; //中間層の学習信号
シグモイド通してないなら x*(1-x) が出てくるのはおかしくね?