基於eigen 實現 matlab sim 的 兩層神經網絡實現

//輸出二分類問題
Type  Neural_Work(Type*data,int datalength=10240,int fs=48000)
{

	MatrixXd W1(25,24);
	MatrixXd W2(2,25);
	VectorXd xmin(24);
	VectorXd xmax(24);

	for (int i = 0; i < xmin.size(); i++)
	{
		xmin[i] = x1_xmin[i];
		xmax[i] = x1_max[i];
	}
	for (int i = 0; i < 25; i++)
	{
		for (int j = 0; j < 24; j++)
		{
			W1(i, j) = w1[i * 24 + j];
		}
			
	}

	for (int i = 0; i < 2; i++)
	{
		for (int j=0; j < 25; j++)
		{
			W2(i, j) = w2[i * 25 + j];
		}
			
	}
	VectorXd xx(datalength);
	for (int i = 0; i < datalength; i++)
	{
		xx(i) = data[i];
	}
	VectorXd x_data1 = mapminmax(xx,-1,1);
	MatrixXd Cn2 = mfcc_m(x_data1.data(), datalength, fs, 24, 1024, 512);
	int m = (int)Cn2.rows();
	int n = (int)Cn2.cols();
	//apply 歸一化
	MatrixXd input_test = mapminmax(Cn2.transpose(), xmin, xmax, 0, 1);
	
	//神經網絡輸入歸一化
	VectorXd x_min(24);
	x_min= VectorXd::Constant(24, 0);
	VectorXd x_max(24);
	x_max= VectorXd::Constant(24, 1);
	MatrixXd  input_data = mapminmax(input_test, x_min, x_max, -1, 1);
	//隱層(第一層)
	MatrixXd y1 = W1*input_data;
	for (int i = 0; i < y1.rows(); i++)
		y1.row(i).array() += B1[i];
	MatrixXd y2 = tansig(y1);
	//第二層
	MatrixXd y3 = W2*y2;
	y3.row(0).array() += B2[0];
	y3.row(1).array() += B2[1];
	//輸出歸一化
	VectorXd xout_min(2);
	xout_min = VectorXd::Constant(2, -1);
	VectorXd xout_max(2);
	xout_max = VectorXd::Constant(2, 1);
	MatrixXd out = mapminmax(y3, xout_min, xout_max, 0, 1);
	

	Type hitnum = 0;
	for (int i = 0; i < 15; i++)
	{
		hitnum = y3.row(0)[i] > y3.row(1)[i] ? hitnum + 1 : hitnum;
	}
	hitnum = hitnum > 7 ? 1 : 0;

	return hitnum;
}

神經網絡模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章