NeuralNet *nn_fann_Fann2NeuralNet(struct fann *ANN ) { unsigned int ANN_NLayers = fann_get_num_layers(ANN), *BiasArray = (unsigned int* ) pgm_malloc (sizeof(unsigned int)*ANN_NLayers), *ANN_NNeurons = (unsigned int* ) pgm_malloc (sizeof(unsigned int)*ANN_NLayers); double *ANN_Weights; NeuralNet *NN; fann_get_bias_array(ANN,BiasArray); fann_get_layer_array(ANN,ANN_NNeurons); ANN_Weights = nn_fann_parse_get_weights(ANN,ANN_NLayers,ANN_NNeurons); NN = nn_NeuralNetCreate( ANN_NLayers, // Na FANN, cada Neuronio tem uma função de ativação. A neuralnet usa somente a função de ativação do primeiro neuronio, // porem a primeira camada da FANN nao tem função de ativação, logo pegamos da camada seguinte (ANN->first_layer+1)->first_neuron->activation_function, ANN->BiperbolicLambda,ANN->BiperbolicT1,ANN->BiperbolicT2, ANN_NNeurons, ANN->input_min,ANN->input_max,ANN->output_min,ANN->output_max, // Na FANN, cada Neuronio tem um steepness de ativação. A neuralnet usa somente o steepness de ativação do primeiro neuronio, // porem a primeira camada da FANN nao tem stepness, logo pegamos da camada seguinte (ANN->first_layer+1)->first_neuron->activation_steepness, // A FANN tem um bias para cada camada da rede, na NeuralNet eh usado somente o bias da primeira camada BiasArray[0], ANN_Weights ); NN->MSE = fann_get_MSE(ANN); return NN; }
void fann_save_matrices(struct fann *network, char *fname){ unsigned int layers; unsigned int layer[100]; unsigned int bias[100]; unsigned int total_weights; unsigned int neuron_inputs; unsigned int writes_counter; DATA_TYPE weight; struct fann_connection *connections; FILE *array; char array_name[255]; int i, j; writes_counter = 0; layers = fann_get_num_layers(network); fann_get_layer_array(network, layer); fann_get_bias_array(network, bias); total_weights = fann_get_total_connections(network); printf("Total weights: %i\n", total_weights); connections = (struct fann_connection *) malloc(total_weights * sizeof(struct fann_connection)); fann_get_connection_array(network, connections); for(i = 1; i < layers; i++){ sprintf(array_name, "%s_W%i.net", fname, i); array = fopen(array_name, "wb"); for (j = 0; j < layer[i]*(layer[i-1] + 1); j++){ weight = connections[writes_counter].weight; #ifdef DEBUG mexPrintf("Number:\t%i\n", writes_counter); mexPrintf("Weight:\t%e\n", connections[writes_counter].weight); mexPrintf("From:\t%i\n", connections[writes_counter].from_neuron); mexPrintf("To:\t%i\n", connections[writes_counter].to_neuron); mexEvalString("drawnow;"); #endif fwrite(&weight, sizeof(DATA_TYPE) , 1, array); writes_counter++; } fclose(array); } return; }