AI-ML
view release on metacpan or search on metacpan
Matrix *matrix_sigmoid(Matrix *m){
return element_wise(m, sigmoid, NULL);
}
Matrix *matrix_ReLU(Matrix *m){
return element_wise(m, ReLU, NULL);
}
Matrix *matrix_d_ReLU(Matrix *m){
return element_wise(m, d_ReLU, NULL);
}
Matrix *matrix_LReLU(Matrix *m, REAL v){
return element_wise(m, LReLU, &v);
}
Matrix *matrix_d_LReLU(Matrix *m, REAL v){
return element_wise(m, d_LReLU, &v);
}
REAL ReLU(REAL a, void* v){
if(a >= 0) return a;
return 0;
}
REAL d_ReLU(REAL a, void *v){
if(a < 0) return 0;
return 1;
}
REAL LReLU(REAL a, void *v){
if(a >= 0) return a;
return a * * ((REAL*)v);
}
REAL d_LReLU(REAL a, void *v){
if(a >= 0) return 1;
return *((REAL*)v);
}
Matrix *matrix_softmax(Matrix *m){
Matrix *sm = matrix_sum(m, -get_max(m));
Matrix *em = matrix_exp(sm);
Matrix *vm;
if(m->rows == 1 && m->columns > 1){
vm = sum(em, HORIZONTAL);
}
else if(m->columns == 1 && m->rows > 1){
vm = sum(em, VERTICAL);
}
Matrix *sf = div_matrices(em, vm);
destroy(sm);
destroy(vm);
destroy(em);
return sf;
}
Matrix *matrix_d_softmax(Matrix *m){
Matrix *exp = matrix_exp(m);
Matrix *s = sum(exp, VERTICAL);
return div_matrices( mul_matrices(exp, sub_matrices(s, exp)) ,s);
}
Matrix *matrix_d_sigmoid(Matrix *m){
return element_wise(m, d_sigmoid, NULL);
}
Matrix *matrix_tanh(Matrix *m){
return element_wise(m, hyperbolic_tan, NULL);
}
Matrix *matrix_d_tanh(Matrix *m){
return element_wise(m, d_hyperbolic_tan, NULL);
}
Matrix *matrix_exp(Matrix *m){
return element_wise(m, exponential, NULL);
}
REAL sigmoid_cost(Matrix *X, Matrix *Y, Matrix *weights){
Matrix *h;
int m, i, size;
m = Y->rows;
h = matrix_sigmoid(dot(X,weights,0,0));
//class1 = matrix_mul(mul_matrices(transpose(Y), matrix_log(h)),-1);
//class2 = mul_matrices(matrix_sum(matrix_mul(Y, -1), 1), matrix_sum(matrix_mul(h, -1), 1));
size = Y->rows * Y->columns;
# ifdef USE_REAL
double cost = 0;
for(i = 0; i < size; i++){
cost += -Y->values[i]*log(h->values[i]) - ( 1 - Y->values[i]) * log(1 - h->values[i]);
}
# else
float cost = 0;
for(i = 0; i < size; i++){
cost += -Y->values[i]*logf(h->values[i]) - ( 1 - Y->values[i]) * logf(1 - h->values[i]);
}
# endif
return cost/m;
}
Matrix *mini_batch(Matrix *m, int start, int size, int axis){
Matrix *r;
int end;
if(start < 0){
fprintf(stderr, "start index need to be bigger or equal index 0\n");
exit(1);
}
end = start + size - 1;
if(axis == 0) // every training example is a column
{
if(end >= m->columns){
fprintf(stderr, "Out of index of columns\n");
exit(1);
}
r = slice(m, -1, -1, start, end);
( run in 0.968 second using v1.01-cache-2.11-cpan-39bf76dae61 )