基于eigen 实现 matlab sim 的 两层神经网络实现

版权声明:转载请注释 https://blog.csdn.net/xinshuwei/article/details/84035009
//输出二分类问题
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;
}

神经网络模型

猜你喜欢

转载自blog.csdn.net/xinshuwei/article/details/84035009