Retrieves a neural network from a file previously saved using imsls_f_mlff_network_write.
#include <imsls.h>
Imsls_f_NN_Network *imsls_f_mlff_network_read (char *filename, …, 0)
The type double function is imsls_d_mlff_network_read.
char *filename
(Input)
The name of an ASCII file containing a description of a trained
neural network previously saved using imsls_f_mlff_network_write.
A complete or relative path can be used. If the optional argument IMSLS_FILE is used,
filename is
ignored and the file is not closed before returning.
A pointer to an Imsls_f_NN_Network data structure containing the neural network stored using imsls_f_mlff_network_write. This space can be released by using the imsls_free function.
#include <imsls.h>
Imsls_f_NN_Network
*imsls_f_mlff_network_read (char
*filename,
IMSLS_PRINT,
IMSLS_FILE,
FILE
*file,
0)
IMSLS_PRINT
(Input)
Prints status of file open, reading and closing.
Default: No printing.
IMSLS_FILE, FILE *file
(Input)
A FILE pointer to a file
opened for reading. This file
is read but not closed. If this option is provided, filename is
ignored. This option allows users to read additional user-defined data and
multiple networks from the same file (see Example 2). To ensure this
file is opened and closed with the same C run-time library used by the product,
open and close this file using imsls_fopen and imsls_fclose
instead of fopen
and fclose.
This function reads an Imsls_f_NN_Network data structure, a neural network previously stored as an ASCII file using imsls_f_mlff_network_write. If the optional argument IMSLS_FILE is provided, the data structure is read from that file stream and the file stream is not closed. If this argument is not provided, imsls_f_mlff_network_read opens a file using the path and name provided in filename, reads the data structure from that file, and then closes the file before returning.
This example reads a network previously trained using the Draper-Smith data. These data consist of 13 patterns, each with four continuous attributes and one dependent variable. The network was stored into 73 lines of an ASCII file named NeuralNetworkEx1.txt using imsls_f_mlff_network_write (see Example 1 of imsls_f_mlff_network_write).
#include <imsls.h>
#include <stdio.h>
int main(){
char *filename = "NeuralNetworkEx1.txt";
int i, j;
int n_patterns =13;
int n_inputs =4;
int n_categorical =0;
int n_continuous =4;
int n_outputs =1;
int *categoricalAtt=NULL;
float ss;
float continuous[4*13], y[13], contAtt[4];
float *draperSmithData;
float forecast[1], forecasts[13];
Imsls_f_NN_Network *network;
draperSmithData = imsls_f_data_sets(5,0);
for(i=0; i < n_patterns; i++){
y[i] = draperSmithData[5*i+4];
for(j=0; j<n_continuous; j++)
continuous[i*n_continuous+j] = draperSmithData[5*i+j];
}
network = imsls_f_mlff_network_read(filename,
IMSLS_PRINT, 0);
for(i=0; i<n_patterns; i++){
for(j=0; j<n_inputs; j++)
contAtt[j] = continuous[i*n_continuous+j];
imsls_f_mlff_network_forecast(network,
n_categorical, n_continuous, categoricalAtt, contAtt,
IMSLS_RETURN_USER, forecast, 0);
forecasts[i] = forecast[0];
}
printf("\nOBS X1 X2 X3 X4 Y");
printf(" FORECAST\n");
ss = 0;
for(i=0; i<n_patterns; i++) {
ss += (y[i]-forecasts[i])*(y[i]-forecasts[i]);
printf("%2d %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f\n",
i, continuous[i*n_continuous], continuous[i*n_continuous+1],
continuous[i*n_continuous+2], continuous[i*n_continuous+3],
y[i], forecasts[i]);
}
printf("Sum of Squared Residuals: %7.2f\n", ss);
}
Notice that the forecasts produced using imsls_f_mlff_network_forecast are identical to the original forecasts in Example 1 of imsls_f_mlff_network_write.
Attempting to open NeuralNetworkEx1.txt for
reading network data structure
File NeuralNetworkEx1.txt Successfully Opened
File NeuralNetworkEx1.txt closed
OBS X1 X2 X3 X4 Y FORECAST
0 7.00 26.00 6.00 60.00 78.50 78.50
1 1.00 29.00 15.00 52.00 74.30 74.30
2 11.00 56.00 8.00 20.00 104.30 104.22
3 11.00 31.00 8.00 47.00 87.60 87.60
4 7.00 52.00 6.00 33.00 95.90 95.78
5 11.00 55.00 9.00 22.00 109.20 109.34
6 3.00 71.00 17.00 6.00 102.70 102.55
7 1.00 31.00 22.00 44.00 72.50 72.50
8 2.00 54.00 18.00 22.00 93.10 93.24
9 21.00 47.00 4.00 26.00 115.90 116.05
10 1.00 40.00 23.00 34.00 83.80 83.80
11 11.00 66.00 9.00 12.00 113.30 112.30
12 10.00 68.00 8.00 12.00 109.40 110.33
Sum of Squared Residuals: 1.97
This example illustrates the use of the optional argument IMSLS_FILE to read multiple neural networks previously stored into a single file using imsls_f_mlff_network_write. Two networks were trained using the Draper-Smith data. These data consist of 13 patterns, each with four continuous attributes and one dependent variable. The first network is trained to forecast the dependent variable using all 4 inputs and the second using only the first 3. The networks are read from an ASCII file previously created using imsls_f_mlff_network_write named NeuralNetworkEx2.txt (see Example 2 of imsls_f_mlff_network_write).
#include <imsls.h>
#include <stdio.h>
#include <stdlib.h>
extern FILE* imsls_fopen(char* filename, char* mode);
extern int imsls_fclose(FILE* file);
int main(){
FILE *file;
char *filename = "NeuralNetworkEx2.txt";
int i, j, n;
int n_patterns =13;
int n_inputs =4;
int n_categorical =0;
int n_continuous =4;
int n_outputs =1;
int n_networks =0;
int *categoricalAtt=NULL;
float ss3, ss4;
float cont4[4*13], y[13], contAtt4[4];
float cont3[3*13];
float *draperSmithData;
float forecast[1], forecasts[2*13];
Imsls_f_NN_Network **neural_network;
draperSmithData = imsls_f_data_sets(5,0);
for(i=0; i < n_patterns; i++){
y[i] = draperSmithData[5*i+4];
for(j=0; j<n_continuous; j++){
cont4[i*n_continuous+j] = draperSmithData[5*i+j];
if(j<3) cont3[i*3+j] = draperSmithData[5*i+j];
}
}
/* open filestream */
file = imsls_fopen(filename, "r");
printf("File %s Opened\n", filename);
/* Read the number of network being placed into this file */
fscanf(file, "%d", &n_networks);
printf("File contains %d neural networks\n", n_networks);
neural_network = (Imsls_f_NN_Network **) malloc(n_networks*
sizeof(Imsls_f_NN_Network *));
printf("Reading Networks and Preparing Forecasts...\n");
for(n=0; n<n_networks; n++){
neural_network[n] = imsls_f_mlff_network_read(NULL,
IMSLS_PRINT, IMSLS_FILE, file, 0);
n_continuous = neural_network[n]->layers[0].n_nodes;
printf("Preparing forecasts for network with");
printf(" %d continuous attributes\n", n_continuous);
for(i=0; i<n_patterns; i++){
for(j=0; j<4; j++) contAtt4[j] = cont4[i*4+j];
imsls_f_mlff_network_forecast(neural_network[n],
n_categorical, n_continuous,
categoricalAtt, contAtt4,
IMSLS_RETURN_USER, forecast, 0);
forecasts[n*n_patterns + i] = forecast[0];
}
}
imsls_fclose(file);
printf("File %s Closed.\n\n", filename);
printf(" ");
printf("FORECAST FORECAST\n");
printf("OBS X1 X2 X3 X4 Y ");
printf("n_cont=3 n_cont=4\n");
ss4 = 0;
ss3 = 0;
for(i=0; i<n_patterns; i++) {
ss4 += (y[i]-forecasts[i])*(y[i]-forecasts[i]);
ss3 += (y[i]-forecasts[n_patterns+i])*
(y[i]-forecasts[n_patterns+i]);
printf("%2d %7.2f %7.2f %7.2f %7.2f %7.2f %7.2f %9.2f\n",
i, cont4[i*4], cont4[i*4+1], cont4[i*4+2], cont4[i*4+3],
y[i], forecasts[n_patterns+i], forecasts[i]);
}
printf("Sum of Squared Residuals for X1-X3: %7.2f\n", ss3);
printf("Sum of Squared Residuals for X1-X4: %7.2f\n", ss4);
}
Notice that the forecasts produced using imsls_f_mlff_network_forecast are identical to the original forecasts in Example 2 of imsls_f_mlff_network_write.
File NeuralNetworkEx2.txt Opened
File contains 2 neural networks
Reading Networks and Preparing Forecasts...
Network restored from file. File not closed.
Preparing forecasts for network with 4 continuous attributes
Network restored from file. File not closed.
Preparing forecasts for network with 3 continuous attributes
File NeuralNetworkEx2.txt Closed.
FORECAST FORECAST
OBS X1 X2 X3 X4 Y n_cont=3 n_cont=4
0 7.00 26.00 6.00 60.00 78.50 78.97 78.50
1 1.00 29.00 15.00 52.00 74.30 73.62 74.30
2 11.00 56.00 8.00 20.00 104.30 104.61 104.30
3 11.00 31.00 8.00 47.00 87.60 87.32 87.60
4 7.00 52.00 6.00 33.00 95.90 94.88 95.90
5 11.00 55.00 9.00 22.00 109.20 108.82 109.20
6 3.00 71.00 17.00 6.00 102.70 102.69 102.70
7 1.00 31.00 22.00 44.00 72.50 72.97 72.50
8 2.00 54.00 18.00 22.00 93.10 94.28 93.10
9 21.00 47.00 4.00 26.00 115.90 115.04 115.90
10 1.00 40.00 23.00 34.00 83.80 83.64 83.80
11 11.00 66.00 9.00 12.00 113.30 114.45 113.30
12 10.00 68.00 8.00 12.00 109.40 109.20 109.40
Sum of Squared Residuals for X1-X3: 5.76
Sum of Squared Residuals for X1-X4: 0.00
IMSLS_FILE_OPEN_FAILURE Unable to open file for reading neural network.