📄 fann_train_data.c
字号:
factor = new_span / old_span;
for(dat = 0; dat < num_data; dat++)
{
for(elem = 0; elem < num_elem; elem++)
{
temp = (data[dat][elem] - old_min) * factor + new_min;
if(temp < new_min)
{
data[dat][elem] = new_min;
/*
* printf("error %f < %f\n", temp, new_min);
*/
}
else if(temp > new_max)
{
data[dat][elem] = new_max;
/*
* printf("error %f > %f\n", temp, new_max);
*/
}
else
{
data[dat][elem] = temp;
}
}
}
}
/*
* Scales the inputs in the training data to the specified range
*/
FANN_EXTERNAL void FANN_API fann_scale_input_train_data(struct fann_train_data *train_data,
fann_type new_min, fann_type new_max)
{
fann_scale_data(train_data->input, train_data->num_data, train_data->num_input, new_min,
new_max);
}
/*
* Scales the inputs in the training data to the specified range
*/
FANN_EXTERNAL void FANN_API fann_scale_output_train_data(struct fann_train_data *train_data,
fann_type new_min, fann_type new_max)
{
fann_scale_data(train_data->output, train_data->num_data, train_data->num_output, new_min,
new_max);
}
/*
* Scales the inputs in the training data to the specified range
*/
FANN_EXTERNAL void FANN_API fann_scale_train_data(struct fann_train_data *train_data,
fann_type new_min, fann_type new_max)
{
fann_scale_data(train_data->input, train_data->num_data, train_data->num_input, new_min,
new_max);
fann_scale_data(train_data->output, train_data->num_data, train_data->num_output, new_min,
new_max);
}
/*
* merges training data into a single struct.
*/
FANN_EXTERNAL struct fann_train_data *FANN_API fann_merge_train_data(struct fann_train_data *data1,
struct fann_train_data *data2)
{
unsigned int i;
fann_type *data_input, *data_output;
struct fann_train_data *dest =
(struct fann_train_data *) malloc(sizeof(struct fann_train_data));
if(dest == NULL)
{
fann_error((struct fann_error*)data1, FANN_E_CANT_ALLOCATE_MEM);
return NULL;
}
if((data1->num_input != data2->num_input) || (data1->num_output != data2->num_output))
{
fann_error((struct fann_error*)data1, FANN_E_TRAIN_DATA_MISMATCH);
return NULL;
}
fann_init_error_data((struct fann_error *) dest);
dest->error_log = data1->error_log;
dest->num_data = data1->num_data+data2->num_data;
dest->num_input = data1->num_input;
dest->num_output = data1->num_output;
dest->input = (fann_type **) calloc(dest->num_data, sizeof(fann_type *));
if(dest->input == NULL)
{
fann_error((struct fann_error*)data1, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
dest->output = (fann_type **) calloc(dest->num_data, sizeof(fann_type *));
if(dest->output == NULL)
{
fann_error((struct fann_error*)data1, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
data_input = (fann_type *) calloc(dest->num_input * dest->num_data, sizeof(fann_type));
if(data_input == NULL)
{
fann_error((struct fann_error*)data1, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
memcpy(data_input, data1->input[0], dest->num_input * data1->num_data * sizeof(fann_type));
memcpy(data_input + (dest->num_input*data1->num_data),
data2->input[0], dest->num_input * data2->num_data * sizeof(fann_type));
data_output = (fann_type *) calloc(dest->num_output * dest->num_data, sizeof(fann_type));
if(data_output == NULL)
{
fann_error((struct fann_error*)data1, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
memcpy(data_output, data1->output[0], dest->num_output * data1->num_data * sizeof(fann_type));
memcpy(data_output + (dest->num_output*data1->num_data),
data2->output[0], dest->num_output * data2->num_data * sizeof(fann_type));
for(i = 0; i != dest->num_data; i++)
{
dest->input[i] = data_input;
data_input += dest->num_input;
dest->output[i] = data_output;
data_output += dest->num_output;
}
return dest;
}
/*
* return a copy of a fann_train_data struct
*/
FANN_EXTERNAL struct fann_train_data *FANN_API fann_duplicate_train_data(struct fann_train_data
*data)
{
unsigned int i;
fann_type *data_input, *data_output;
struct fann_train_data *dest =
(struct fann_train_data *) malloc(sizeof(struct fann_train_data));
if(dest == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
return NULL;
}
fann_init_error_data((struct fann_error *) dest);
dest->error_log = data->error_log;
dest->num_data = data->num_data;
dest->num_input = data->num_input;
dest->num_output = data->num_output;
dest->input = (fann_type **) calloc(dest->num_data, sizeof(fann_type *));
if(dest->input == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
dest->output = (fann_type **) calloc(dest->num_data, sizeof(fann_type *));
if(dest->output == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
data_input = (fann_type *) calloc(dest->num_input * dest->num_data, sizeof(fann_type));
if(data_input == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
memcpy(data_input, data->input[0], dest->num_input * dest->num_data * sizeof(fann_type));
data_output = (fann_type *) calloc(dest->num_output * dest->num_data, sizeof(fann_type));
if(data_output == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
memcpy(data_output, data->output[0], dest->num_output * dest->num_data * sizeof(fann_type));
for(i = 0; i != dest->num_data; i++)
{
dest->input[i] = data_input;
data_input += dest->num_input;
dest->output[i] = data_output;
data_output += dest->num_output;
}
return dest;
}
FANN_EXTERNAL struct fann_train_data *FANN_API fann_subset_train_data(struct fann_train_data
*data, unsigned int pos,
unsigned int length)
{
unsigned int i;
fann_type *data_input, *data_output;
struct fann_train_data *dest =
(struct fann_train_data *) malloc(sizeof(struct fann_train_data));
if(dest == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
return NULL;
}
if(pos > data->num_data || pos+length > data->num_data)
{
fann_error((struct fann_error*)data, FANN_E_TRAIN_DATA_SUBSET, pos, length, data->num_data);
return NULL;
}
fann_init_error_data((struct fann_error *) dest);
dest->error_log = data->error_log;
dest->num_data = length;
dest->num_input = data->num_input;
dest->num_output = data->num_output;
dest->input = (fann_type **) calloc(dest->num_data, sizeof(fann_type *));
if(dest->input == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
dest->output = (fann_type **) calloc(dest->num_data, sizeof(fann_type *));
if(dest->output == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
data_input = (fann_type *) calloc(dest->num_input * dest->num_data, sizeof(fann_type));
if(data_input == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
memcpy(data_input, data->input[pos], dest->num_input * dest->num_data * sizeof(fann_type));
data_output = (fann_type *) calloc(dest->num_output * dest->num_data, sizeof(fann_type));
if(data_output == NULL)
{
fann_error((struct fann_error*)data, FANN_E_CANT_ALLOCATE_MEM);
fann_destroy_train(dest);
return NULL;
}
memcpy(data_output, data->output[pos], dest->num_output * dest->num_data * sizeof(fann_type));
for(i = 0; i != dest->num_data; i++)
{
dest->input[i] = data_input;
data_input += dest->num_input;
dest->output[i] = data_output;
data_output += dest->num_output;
}
return dest;
}
FANN_EXTERNAL unsigned int FANN_API fann_length_train_data(struct fann_train_data *data)
{
return data->num_data;
}
FANN_EXTERNAL unsigned int FANN_API fann_num_input_train_data(struct fann_train_data *data)
{
return data->num_input;
}
FANN_EXTERNAL unsigned int FANN_API fann_num_output_train_data(struct fann_train_data *data)
{
return data->num_output;
}
/* INTERNAL FUNCTION
Save the train data structure.
*/
int fann_save_train_internal(struct fann_train_data *data, const char *filename,
unsigned int save_as_fixed, unsigned int decimal_point)
{
int retval = 0;
FILE *file = fopen(filename, "w");
if(!file)
{
fann_error((struct fann_error *) data, FANN_E_CANT_OPEN_TD_W, filename);
return -1;
}
retval = fann_save_train_internal_fd(data, file, filename, save_as_fixed, decimal_point);
fclose(file);
return retval;
}
/* INTERNAL FUNCTION
Save the train data structure.
*/
int fann_save_train_internal_fd(struct fann_train_data *data, FILE * file, const char *filename,
unsigned int save_as_fixed, unsigned int decimal_point)
{
unsigned int num_data = data->num_data;
unsigned int num_input = data->num_input;
unsigned int num_output = data->num_output;
unsigned int i, j;
int retval = 0;
#ifndef FIXEDFANN
unsigned int multiplier = 1 << decimal_point;
#endif
fprintf(file, "%u %u %u\n", data->num_data, data->num_input, data->num_output);
for(i = 0; i < num_data; i++)
{
for(j = 0; j < num_input; j++)
{
#ifndef FIXEDFANN
if(save_as_fixed)
{
fprintf(file, "%d ", (int) (data->input[i][j] * multiplier));
}
else
{
if(((int) floor(data->input[i][j] + 0.5) * 1000000) ==
((int) floor(data->input[i][j] * 1000000.0 + 0.5)))
{
fprintf(file, "%d ", (int) data->input[i][j]);
}
else
{
fprintf(file, "%f ", data->input[i][j]);
}
}
#else
fprintf(file, FANNPRINTF " ", data->input[i][j]);
#endif
}
fprintf(file, "\n");
for(j = 0; j < num_output; j++)
{
#ifndef FIXEDFANN
if(save_as_fixed)
{
fprintf(file, "%d ", (int) (data->output[i][j] * multiplier));
}
else
{
if(((int) floor(data->output[i][j] + 0.5) * 1000000) ==
((int) floor(data->output[i][j] * 1000000.0 + 0.5)))
{
fprintf(file, "%d ", (int) data->output[i][j]);
}
else
{
fprintf(file, "%f ", data->output[i][j]);
}
}
#else
fprintf(file, FANNPRINTF " ", data->output[i][j]);
#endif
}
fprintf(file, "\n");
}
return retval;
}
/*
* INTERNAL FUNCTION Reads training data from a file descriptor.
*/
struct fann_train_data *fann_read_train_from_fd(FILE * file, const char *filename)
{
unsigned int num_input, num_output, num_data, i, j;
unsigned int line = 1;
fann_type *data_input, *data_output;
struct fann_train_data *data =
(struct fann_train_data *) malloc(sizeof(struct fann_train_data));
if(data == NULL)
{
fann_error(NULL, FANN_E_CANT_ALLOCATE_MEM);
return NULL;
}
if(fscanf(file, "%u %u %u\n", &num_data, &num_input, &num_output) != 3)
{
fann_error(NULL, FANN_E_CANT_READ_TD, filename, line);
fann_destroy_train(data);
return NULL;
}
line++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -