public dynamic Forward(float[][] input, float[][] h_prev, float[][] c_prev) { //a_vector = np.dot(x, self.weight_ih.T) + np.dot(h_prev, self.weight_hh.T) //a_vector += self.bias_ih + self.bias_hh Xinput = input; xh_prev = h_prev; xc_prev = c_prev; var ih = convLayerih.Forward(input); var hh = convLayerhh.Forward(h_prev); var a_vector = Matrix.MatrixAdd(ih, hh); List <float[][]> liast = Matrix.chunk(a_vector, 4, 1); var a_i = liast[0]; var a_f = liast[1]; var a_c = liast[2]; var a_o = liast[3]; input_gate = input_gate_s.Forward(a_i); forget_gate = forget_gate_s.Forward(a_f); cell_memory = cell_memory_tl.Forward(a_c); output_gate = output_gate_s.Forward(a_o); var c_next_temp = c_next_mul.Forward(forget_gate, c_prev); var mulin_gate = mulin_gate_mul.Forward(input_gate, cell_memory); var c_next = Matrix.MatrixAdd(c_next_temp, mulin_gate); var h_next = h_next_mul.Forward(output_gate, cell_tl.Forward(c_next)); // dh_prev = Matrix.zroe(h_next.Length, h_next[0].Length); return(h_next, c_next);//上次的状态,上次的记忆 }
//MulLayer ZHZTL = new MulLayer(); public (dynamic, dynamic) Forward(float[][] input, float[][] state) { var H = state; var X = convLayerih.Forward(input); var HH = convLayerhh.Forward(H); List <float[][]> listX = Matrix.chunk(X, 3, 1); List <float[][]> listHH = Matrix.chunk(HH, 3, 1); var ZS = Matrix.MatrixAdd(listX[0], listHH[0]); var Z = ZSL.Forward(ZS); var RS = Matrix.MatrixAdd(listX[1], listHH[1]); var R = RSL.Forward(RS); var RH = RHM.Forward(R, listHH[2]); var RHS = Matrix.MatrixAdd(listX[2], RH); var H_tilda = THL.Forward(RHS); var ZH = ZHL.Forward(Z, H); var Z1 = Matrix.MatrixSub(1, Z); var ZHT = ZHTL.Forward(Z1, H_tilda); H = Matrix.MatrixAdd(ZH, ZHT); var Y = convLayerhq.Forward(H); return(Y, H); }
public void ForwardBackwardTest() { var input = new TensorOld(new double[] { 4, 6, 1, 4, 8, 4, 5, 1, 5, 3, 5, 7, 1, 7, 2, 8, }, 1, 1, 4, 4); var conv = new ConvLayer(4, 2, 1, 1); conv.SetFilters(new TensorOld(new double[] { 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, }, 4, 1, 2, 2)); var expected = new TensorOld(new double[] { 0, 0, 0, 0, 0, 4, 10, 7, 5, 4, 8, 12, 9, 6, 1, 5, 8, 8, 12, 7, 1, 8, 9, 10, 8, 4, 10, 7, 5, 4, 8, 12, 9, 6, 1, 5, 8, 8, 12, 7, 1, 8, 9, 10, 8, 0, 0, 0, 0, 0, 0, 4, 6, 1, 4, 0, 12, 10, 6, 5, 0, 13, 7, 10, 8, 0, 6, 10, 7, 15, 0, 1, 7, 2, 8, 4, 6, 1, 4, 0, 12, 10, 6, 5, 0, 13, 7, 10, 8, 0, 6, 10, 7, 15, 0, 1, 7, 2, 8, 0, }, 1, 4, 5, 5); conv.PrepareTrain(input); var acutal = conv.Forward(input); Assert.Equal(acutal, expected); var error = expected / 10; var back = conv.Backward(error); }
/// <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]); }