private Function.Matrix[] Backward(Function.Matrix x, Function.Matrix y, Function.Matrix w1, Function.Matrix w2, float alpha) { var z1 = Function.Matrix.Multiply(Function.Matrix.Transpose(w1), x); var a1 = Function.sigmoid(z1); var z2 = Function.Matrix.Multiply(Function.Matrix.Transpose(w2), a1); var a2 = Function.sigmoid(z2); var diff = Function.Matrix.Minus(a2, y); var w2Grad = Function.Matrix.Multiply(Function.Matrix.Multiply(a1, Function.Dsigmoid(z2)), diff); var w1Grad = Function.Matrix.Multiply(Function.Matrix.Transpose(w2), Function.Dsigmoid(z1)); w1Grad = Function.Matrix.Multiply(x, Function.Matrix.Multiply(Function.Matrix.Multiply(w1Grad, Function.Dsigmoid(z2)), diff)); //DisplayMatrix(Function.Matrix.Multiply(alpha, w1Grad)); //Debug.Log(Function.Matrix.Dimension(w1)); //Debug.Log(Function.Matrix.Shape(Function.Dsigmoid(w1Grad))[0] + ", " + Function.Matrix.Shape(Function.Dsigmoid(w1Grad))[1]); var w1Next = Function.Matrix.Minus(w1, Function.Matrix.Multiply(alpha, w1Grad)); var w2Next = Function.Matrix.Minus(w2, Function.Matrix.Multiply(alpha, w2Grad)); var result = new Function.Matrix[2]; result[0] = w1Next; result[1] = w2Next; return(result); }
private Function.Matrix Forward(Function.Matrix x, Function.Matrix w1, Function.Matrix w2) { //Debug.Log(Function.Matrix.Shape(x)[0] + ", " + Function.Matrix.Shape(x)[1]); var z1 = Function.Matrix.Multiply(Function.Matrix.Transpose(w1), x); //DisplayMatrix(z1); var a1 = Function.sigmoid(z1); var z2 = Function.Matrix.Multiply(Function.Matrix.Transpose(w2), a1); var a2 = Function.sigmoid(z2); return(a2); }
private float loss(Function.Matrix predict, Function.Matrix groundTruth) { var diff = Function.Matrix.Minus(predict, groundTruth); float result = 0f; foreach (var col in diff.colVector) { foreach (var element in col.vec) { result += element * element; } } var shape = Function.Matrix.Shape(diff); result /= shape[0] * shape[1]; return(result); }
internal void DisplayMatrix(Function.Matrix m) { StringBuilder note = new StringBuilder(); note.Append("["); foreach (var i in m.colVector) { note.Append("["); foreach (var j in i.vec) { note.Append(j.ToString() + ", "); } note.Append("]"); } note.Append("]"); txt.text = note.ToString(); }
internal void DisplayMatrix(Function.Matrix m) { int row = Function.Matrix.Shape(m)[0]; int col = Function.Matrix.Shape(m)[1]; Debug.Log(row + ", " + col); StringBuilder note = new StringBuilder(); note.Append("["); for (int i = 0; i < row; ++i) { note.Append("["); for (int j = 0; j < col; ++j) { note.Append(m.colVector[j].vec[i].ToString() + ", "); } note.Append("]"); } note.Append("]"); text.text = note.ToString(); }