// Матрицей считается размерности h, d. Вектором d // Первый аргумент -- матрица весов, батч во втором public static Tensor4 <T> MultAsMatrix(Tensor4 <T> A, Tensor4 <T> B) { Tensor4 <T> result = new Tensor4 <T>(A.W, B.H, A.D, B.BS); for (int i = 0; i < B.BS; i++) { for (int j = 0; j < B.H; j++) { for (int k = 0; k < A.D; k++) { for (int z = 0; z < A.H; z++) { result[0, j, k, i] += (A[0, z, k, i] as dynamic) * (B[0, j, z, i] as dynamic); } } } } return(result); }
public static Tensor4 <T> operator/(Tensor4 <T> B, dynamic A) { Tensor4 <T> newTen = new Tensor4 <T>(A.W, A.H, A.D, A.BS); for (int i = 0; i < A.W; i++) { for (int j = 0; j < A.H; j++) { for (int k = 0; k < A.D; k++) { for (int z = 0; z < A.BS; z++) { newTen[i, j, k, z] = (B[i, j, k, z] as dynamic) / A; } } } } return(newTen); }
// Сама функция может быть запараллелина, но параллелизация вдоль bs недопустима, // т.к. собьются метки классов public static Tensor4 <T> ConvolutionalLayerForward(Tensor4 <T> map, Tensor4 <T> feature) { throw new NotImplementedException(); }