/********************************************************************** * netfile.c * * (C) 2000 J. Ahrensfeld * **********************************************************************/ #include #include #include #include "nntypes.h" #include "nnet.h" #include "nnfile.h" /**********************************************************************/ #define VERSION "0.1" #define MAX_TOKENS 15 #define MAX_NEURON_TYPES 6 /**********************************************************************/ char *pszNNtypeList[] = { "MLP", "RECURRENT", 0 }; char *pszTokenList[]= { "NINPUTS","NOUTPUTS","NHIDDENLAYERS","NHIDDENNEURONS","HIDDENTYPE","OUTPUTTYPE", "TRAINING","LEARNINGRATE","MOMENTUM","ERRORTHRESHOLD","MAXEPOCHS","REPORTUPDATE", "MAXPATTERNS", "INITWEIGHTRANGE", "NNTYPE", 0 }; char *pszNeuronTypeList[]= { "NULL", "LINEAR", "TANH", "ASIGMOID", "SIGMOID", "SSIGMOID", "FSIGMOID", 0 }; enum Token { NINPUTS, NOUTPUTS, NHIDDENLAYERS, NHIDDENNEURONS, HIDDENTYPE, OUTPUTTYPE, TRAINING, LEARNINGRATE, MOMENTUM, ERRORTHRESHOLD, MAXEPOCHS, REPORTUPDATE, MAXPATTERNS, INITWEIGHTRANGE, NNTYPE, NOTFOUND }; /**********************************************************************/ int ReadNextToken(FILE *pFile, char *pToken) { int i, res=EXIT_FAILURE; while(!feof(pFile)) { fscanf(pFile,"%s",pToken); if((pToken[0]=='#') || (pToken[0] < '0')) continue; res = EXIT_SUCCESS; for (i=0; pToken[i]; i++) pToken[i]=toupper(pToken[i]); break; } return res; } int ReadValue(FILE *pFile, char* szValue) { int i; szValue[0] = 0; fscanf(pFile,"%s",szValue); for (i=0; szValue[i]; i++) szValue[i]=toupper(szValue[i]); return 0; } int Seek(FILE *pFile, char **pTokenList, int nMaxToken, int *RetToken) { char szToken[256]; int nToken=0, res = EXIT_FAILURE, status=EXIT_SUCCESS; *RetToken = NOTFOUND; while ((status == EXIT_SUCCESS) && (*RetToken == NOTFOUND)) { status=ReadNextToken(pFile,szToken); for (nToken=0; nToken < nMaxToken; nToken++) { if(strcmp(szToken,pszTokenList[nToken])) continue; //cout << "Token(" << nToken << "): " << szToken << endl; *RetToken = nToken; res = EXIT_SUCCESS; break; } } return res; } int ReadNetFile(char* szFileName, NETFILE *NetData) { char szValue[80], szToken[256]; FILE *pFile; UINT32 pos; NETFILE net; UINT32 Token, t, status, i, error; UINT32 layer, neurons, neuronType; UINT32 size, p; /***************************************************************************/ // INIT net.nInputs = 0; net.nOutputs = 0; net.nHiddenLayers = 0; net.nHiddenNeurons = 0; net.nTrainingSets = 0; net.LearningRate = 0.4; net.Momentum = 0.8; net.ErrorThreshold = 0; net.MaxEpochs = 25000; net.reportUpd = 100; net.maxPatterns = 1000000; net.initwrange = 1.0; net.nntype = NNTYPE_MLP; /***************************************************************************/ error = EXIT_FAILURE; while(1) { /***************************************************************************/ /* Datei oeffnen */ /***************************************************************************/ printf("Lese Datei %s\n",szFileName); pFile = fopen(szFileName,"r"); if (pFile==NULL) { printf("Die Datei %s konnte nicht geöffnet werden.\n",szFileName); break; } /***************************************************************************/ /* Erwarte "net"-Identifier */ /***************************************************************************/ ReadNextToken(pFile, szToken); pos = ftell(pFile); if (!strcmp(szToken,"NET")) printf("%s\n",szToken); else { printf("ERROR: Missing NET-identifier\n"); break; } /***************************************************************************/ /* Inputs, Outputs, Layer */ /***************************************************************************/ pos=fseek(pFile, 0, SEEK_SET); status = 0; Token = NOTFOUND; while ((net.nInputs*net.nOutputs*net.nHiddenLayers)==0 && !status) { status=Seek(pFile,pszTokenList, MAX_TOKENS, &Token); switch (Token) { case NNTYPE: net.nntype = NNTYPE_MLP; ReadValue(pFile, szValue); i=0; while(pszNNtypeList[i]) { if(!strcmp(szValue, pszNNtypeList[i])) { net.nntype = i; break; } i++; } printf("Neural Net type is %s\n",pszNNtypeList[net.nntype]); break; case NINPUTS: ReadValue(pFile, szValue); net.nInputs = atoi(szValue); printf("nInputs = %d\n",net.nInputs); break; case NOUTPUTS: ReadValue(pFile, szValue); net.nOutputs = atoi(szValue); printf("nOutputs = %d\n",net.nOutputs); break; case NHIDDENLAYERS: ReadValue(pFile, szValue); net.nHiddenLayers = atoi(szValue); printf("nHiddenLayers = %d\n",net.nHiddenLayers); break; default: break; } } if(status == EXIT_FAILURE) { printf("Invalid file Inputs, Outputs, Layer!\n"); break; } /***************************************************************************/ /* Layer Organization */ /***************************************************************************/ pos=fseek(pFile, 0, SEEK_SET); t = 0; status = 0; Token = NOTFOUND; while (t < net.nHiddenLayers && !status ) { status = Seek(pFile,pszTokenList, MAX_TOKENS, &Token); if ((Token != NHIDDENNEURONS) && !feof(pFile)) continue; { ReadValue(pFile, szValue); layer = atoi(szValue); ReadValue(pFile, szValue); neurons = atoi(szValue); printf("HiddenLayer[%d]: %d Neurons\n",layer,neurons); net.LInfo[layer].nNeurons = neurons; net.nHiddenNeurons += neurons; t++; } } printf("Total number of Hidden Neurons = %d\n",net.nHiddenNeurons); if(status == EXIT_FAILURE) { printf("Invalid Layer Organization!\n"); break; } /***************************************************************************/ /* NeuronType */ /***************************************************************************/ pos=fseek(pFile, 0, SEEK_SET); for (layer=0; layer