diff options
author | Determinant <ted.sybil@gmail.com> | 2016-05-01 00:44:43 +0800 |
---|---|---|
committer | Determinant <ted.sybil@gmail.com> | 2016-05-01 00:44:43 +0800 |
commit | 34fe366898bc48b4e1ad6fa945dad8821857a459 (patch) | |
tree | 1210e1a28dd4c0f6e1cefe0b98c95b333ceec158 /nerv/lib/matrix/generic/mmatrix.c | |
parent | 2bb64ecc5e0350f89cff1e978a1b8dcca1528a06 (diff) | |
parent | 1aaffa6b9a56d4d580dea7bf3f1b7df1eec5da2f (diff) |
Merge branch 'master' of ssh://speechlab.sjtu.edu.cn:8022/nerv-dev/nerv
Diffstat (limited to 'nerv/lib/matrix/generic/mmatrix.c')
-rw-r--r-- | nerv/lib/matrix/generic/mmatrix.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/nerv/lib/matrix/generic/mmatrix.c b/nerv/lib/matrix/generic/mmatrix.c index ccfb2ce..e76d4fb 100644 --- a/nerv/lib/matrix/generic/mmatrix.c +++ b/nerv/lib/matrix/generic/mmatrix.c @@ -460,6 +460,45 @@ void nerv_matrix_(tanh_grad)(Matrix *nerr, const Matrix *err, NERV_SET_STATUS(status, NERV_NORMAL, 0); } +void nerv_matrix_(relu)(Matrix *b, const Matrix *a, + MContext *context, Status *status) { + CHECK_SAME_DIMENSION(a, b, status); + int i, j; + size_t astride = a->stride, bstride = b->stride; + const MATRIX_ELEM *arow = MATRIX_ELEM_PTR(a); + MATRIX_ELEM *brow = MATRIX_ELEM_PTR(b); + for (i = 0; i < b->nrow; i++) + { + for (j = 0; j < b->ncol; j++) + brow[j] = arow[j] > 0 ? arow[j] : 0; + arow = MATRIX_NEXT_ROW_PTR(arow, astride); + brow = MATRIX_NEXT_ROW_PTR(brow, bstride); + } + NERV_SET_STATUS(status, NERV_NORMAL, 0); +} + +void nerv_matrix_(relu_grad)(Matrix *nerr, const Matrix *err, + const Matrix *output, + MContext *context, Status *status) { + CHECK_SAME_DIMENSION(nerr, err, status); + CHECK_SAME_DIMENSION(nerr, output, status); + int i, j; + size_t nerr_stride = nerr->stride, + err_stride = err->stride, + out_stride = output->stride; + MATRIX_ELEM *nerr_row = MATRIX_ELEM_PTR(nerr); + const MATRIX_ELEM *err_row = MATRIX_ELEM_PTR(err), + *out_row = MATRIX_ELEM_PTR(output); + for (i = 0; i < nerr->nrow; i++) + { + for (j = 0; j < nerr->ncol; j++) + nerr_row[j] = (out_row[j] > 0 ? 1 : 0) * err_row[j]; + nerr_row = MATRIX_NEXT_ROW_PTR(nerr_row, nerr_stride); + err_row = MATRIX_NEXT_ROW_PTR(err_row, err_stride); + out_row = MATRIX_NEXT_ROW_PTR(out_row, out_stride); + } + NERV_SET_STATUS(status, NERV_NORMAL, 0); +} void nerv_matrix_(expand_frm)(Matrix *a, const Matrix *b, int cont, MContext *context, Status *status) { if (a->nrow != b->nrow) |