static void test2D() { float[][][,] x = JsonConvert.DeserializeObject <float[][][, ]>(getstr("D:\\x.json")); float[][][,] y = JsonConvert.DeserializeObject <float[][][, ]>(getstr("D:\\y.json")); float[][][,] w = JsonConvert.DeserializeObject <float[][][, ]>(getstr("D:\\w1.json")); float[] wb = JsonConvert.DeserializeObject <float[]>(getstr("D:\\w2.json")); Conv2DLayer cl = new Conv2DLayer(1, 1, 3, 1, 2, false); MSELoss mloss = new MSELoss(); cl.weights = new float[w.GetLength(0)][][, ]; for (int a = 0; a < w.GetLength(0); a++) { cl.weights[a] = new float[w[0].GetLength(0)][, ]; for (int b = 0; b < w[a].GetLength(0); b++) { cl.weights[a][b] = new float[0, 0]; cl.weights[a][b] = w[a][b]; } } cl.basicData = wb; //向前传播 dynamic temp = cl.Forward(x); SigmodLayer sl = new SigmodLayer(); temp = sl.Forward(temp); //TanhLayer tl = new TanhLayer(); //temp = tl.forward(temp); //MulLayer ml = new MulLayer(); //temp = ml.forward(temp, y); float loss = mloss.Forward(temp, y); //向后传播 dynamic grad = mloss.Backward();//计算误差梯度 grad = sl.Backward(grad); //grad = ml.backward(grad); //grad = tl.backward(grad); dynamic grad3 = cl.backward(grad);//卷积计算在 所有计算的最后面进行 prirt(grad3.grid); prirt(grad3.basic); }
/// <summary> /// BP网络测试 /// </summary> static void BP() { float[][] x = JsonConvert.DeserializeObject <float[][]>(util.getstr("D:\\bpx.json")); //训练数据 float[][] y = JsonConvert.DeserializeObject <float[][]>(util.getstr("D:\\bpy.json")); //训练标签 float[][] w1 = JsonConvert.DeserializeObject <float[][]>(util.getstr("D:\\bpw.json")); ConvLayer cl1 = new ConvLayer(13, 5, true); cl1.weights = w1; SigmodLayer sl = new SigmodLayer(); float lr = 0.5f; ConvLayer cl2 = new ConvLayer(5, 1, true); //SigmodLayer s2 = new SigmodLayer(); int i = 0, a = 0; while (a < 5000) { //i = 0; //while (i < 100) //{ // float[][] xx2 = new float[1][]; // xx2[0] = new float[x[0].GetLength(0)]; // for (var f = 0; f < x[0].GetLength(0); f++) // { // xx2[0][f] = x[i][f]; // } dynamic ff = cl1.Forward(x); ff = sl.Forward(ff); ff = cl2.Forward(ff); // dynamic ff22 = s2.forward(ff); //计算误差 MSELoss mloss = new MSELoss(); //float[][] yy2= new float[1][]; //yy2[0] = y[i]; var loss = mloss.Forward(ff, y); Console.WriteLine("误差:" + loss); dynamic grid = mloss.Backward(); //反传播w2 // dynamic grid2 =s2.backward(grid); dynamic w22 = cl2.backweight(grid); //反传播W1 dynamic grid1 = cl2.backward(grid); grid1 = sl.Backward(grid1); dynamic w11 = cl1.backweight(grid1); cl2.weights = Matrix.MatrixSub(cl2.weights, Matrix.multiply(w22.grid, lr)); cl2.basicData = Matrix.MatrixSub(cl2.basicData, Matrix.multiply(w22.basic, lr)); cl1.weights = Matrix.MatrixSub(cl1.weights, Matrix.multiply(w11.grid, lr)); cl1.basicData = Matrix.MatrixSub(cl1.basicData, Matrix.multiply(w11.basic, lr)); i++; // } a++; } //测试网络 float[][] xx = new float[1][]; xx[0] = new float[x[0].GetLength(0)]; var aa = 3; for (var f = 0; f < x[0].GetLength(0); f++) { xx[0][f] = x[aa][f]; } dynamic ff2 = cl1.Forward(xx); ff2 = sl.Forward(ff2); ff2 = cl2.Forward(ff2); util.prirt(ff2); util.prirt(y[aa]); }