Ejemplo n.º 1
0
bool RandomForests::loadModelFromFile(fstream &file){
    
    clear();
    
    if(!file.is_open())
    {
        errorLog << "loadModelFromFile(string filename) - Could not open file to load model" << endl;
        return false;
    }
    
    std::string word;
    std::string treeNodeType;
    
    file >> word;
    
    //Find the file type header
    if(word != "GRT_RANDOM_FOREST_MODEL_FILE_V1.0"){
        errorLog << "loadModelFromFile(string filename) - Could not find Model File Header" << endl;
        return false;
    }
    
    //Load the base settings from the file
    if( !Classifier::loadBaseSettingsFromFile(file) ){
        errorLog << "loadModelFromFile(string filename) - Failed to load base settings from file!" << endl;
        return false;
    }
    
    file >> word;
    if(word != "DecisionTreeNodeType:"){
        Classifier::errorLog << "loadModelFromFile(string filename) - Could not find the DecisionTreeNodeType!" << endl;
        return false;
    }
    file >> treeNodeType;
    
    if( treeNodeType != "NULL" ){
        
        decisionTreeNode = dynamic_cast< DecisionTreeNode* >( DecisionTreeNode::createInstanceFromString( treeNodeType ) );
        
        if( decisionTreeNode == NULL ){
            Classifier::errorLog << "loadModelFromFile(string filename) - Could not create new DecisionTreeNode from type: " << treeNodeType << endl;
            return false;
        }
        
        if( !decisionTreeNode->loadFromFile( file ) ){
            Classifier::errorLog <<"loadModelFromFile(fstream &file) - Failed to load decisionTreeNode settings from file!" << endl;
            return false;
        }
    }else{
        Classifier::errorLog <<"loadModelFromFile(fstream &file) - Failed to load decisionTreeNode! DecisionTreeNodeType is NULL!" << endl;
        return false;
    }
    
    file >> word;
    if(word != "ForestSize:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the ForestSize!" << endl;
        return false;
    }
    file >> forestSize;
    
    file >> word;
    if(word != "NumSplittingSteps:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the NumSplittingSteps!" << endl;
        return false;
    }
    file >> numRandomSplits;
    
    file >> word;
    if(word != "MinNumSamplesPerNode:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the MinNumSamplesPerNode!" << endl;
        return false;
    }
    file >> minNumSamplesPerNode;
    
    file >> word;
    if(word != "MaxDepth:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the MaxDepth!" << endl;
        return false;
    }
    file >> maxDepth;
    
    file >> word;
    if(word != "RemoveFeaturesAtEachSpilt:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the RemoveFeaturesAtEachSpilt!" << endl;
        return false;
    }
    file >> removeFeaturesAtEachSpilt;
    
    file >> word;
    if(word != "TrainingMode:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the TrainingMode!" << endl;
        return false;
    }
    file >> trainingMode;
    
    file >> word;
    if(word != "ForestBuilt:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the ForestBuilt!" << endl;
        return false;
    }
    file >> trained;
    
    if( trained ){
        //Find the forest header
        file >> word;
        if(word != "Forest:"){
            errorLog << "loadModelFromFile(string filename) - Could not find the Forest!" << endl;
            return false;
        }
        
        //Load each tree
        UINT treeIndex;
        forest.reserve( forestSize );
        for(UINT i=0; i<forestSize; i++){
            
            file >> word;
            if(word != "Tree:"){
                errorLog << "loadModelFromFile(string filename) - Could not find the Tree Header!" << endl;
                cout << "WORD: " << word << endl;
                cout << "Tree i: " << i << endl;
                return false;
            }
            file >> treeIndex;
            
            if( treeIndex != i+1 ){
                errorLog << "loadModelFromFile(string filename) - Incorrect tree index: " << treeIndex << endl;
                return false;
            }
            
            file >> word;
            if(word != "TreeNodeType:"){
                errorLog << "loadModelFromFile(string filename) - Could not find the TreeNodeType!" << endl;
                cout << "WORD: " << word << endl;
                cout << "i: " << i << endl;
                return false;
            }
            file >> treeNodeType;
            
            //Create a new DTree
            DecisionTreeNode *tree = dynamic_cast< DecisionTreeNode* >( DecisionTreeNode::createInstanceFromString( treeNodeType ) );
            
            if( tree == NULL ){
                errorLog << "loadModelFromFile(fstream &file) - Failed to create new Tree!" << endl;
                return false;
            }
            
            //Load the tree from the file
            tree->setParent( NULL );
            if( !tree->loadFromFile( file ) ){
                errorLog << "loadModelFromFile(fstream &file) - Failed to load tree from file!" << endl;
                return false;
            }
            
            //Add the tree to the forest
            forest.push_back( tree );
        }
    }
    
    return true;
}
Ejemplo n.º 2
0
bool RandomForests::loadModelFromFile(fstream &file){
    
    clear();
    
    if(!file.is_open())
    {
        errorLog << "loadModelFromFile(string filename) - Could not open file to load model" << endl;
        return false;
    }
    
    std::string word;
    
    //Find the file type header
    file >> word;
    if(word != "GRT_RANDOM_FOREST_MODEL_FILE_V1.0"){
        errorLog << "loadModelFromFile(string filename) - Could not find Model File Header" << endl;
        return false;
    }
    
    file >> word;
    if(word != "NumFeatures:"){
        errorLog << "loadModelFromFile(string filename) - Could not find NumFeatures!" << endl;
        return false;
    }
    file >> numInputDimensions;
    
    file >> word;
    if(word != "NumClasses:"){
        errorLog << "loadModelFromFile(string filename) - Could not find NumClasses!" << endl;
        return false;
    }
    file >> numClasses;
    
    file >> word;
    if(word != "UseScaling:"){
        errorLog << "loadModelFromFile(string filename) - Could not find UseScaling!" << endl;
        return false;
    }
    file >> useScaling;
    
    file >> word;
    if(word != "UseNullRejection:"){
        errorLog << "loadModelFromFile(string filename) - Could not find UseNullRejection!" << endl;
        return false;
    }
    file >> useNullRejection;
    
    ///Read the ranges if needed
    if( useScaling ){
        //Resize the ranges buffer
        ranges.resize(numInputDimensions);
        
        file >> word;
        if(word != "Ranges:"){
            errorLog << "loadModelFromFile(string filename) - Could not find the Ranges!" << endl;
            return false;
        }
        for(UINT n=0; n<ranges.size(); n++){
            file >> ranges[n].minValue;
            file >> ranges[n].maxValue;
        }
    }
    
    file >> word;
    if(word != "ForestSize:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the ForestSize!" << endl;
        return false;
    }
    file >> forestSize;
    
    file >> word;
    if(word != "NumSplittingSteps:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the NumSplittingSteps!" << endl;
        return false;
    }
    file >> numRandomSplits;
    
    file >> word;
    if(word != "MinNumSamplesPerNode:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the MinNumSamplesPerNode!" << endl;
        return false;
    }
    file >> minNumSamplesPerNode;
    
    file >> word;
    if(word != "MaxDepth:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the MaxDepth!" << endl;
        return false;
    }
    file >> maxDepth;
    
    file >> word;
    if(word != "ForestBuilt:"){
        errorLog << "loadModelFromFile(string filename) - Could not find the ForestBuilt!" << endl;
        return false;
    }
    file >> trained;
    
    if( trained ){
        file >> word;
        if(word != "Forest:"){
            errorLog << "loadModelFromFile(string filename) - Could not find the Forest!" << endl;
            return false;
        }
        
        UINT treeIndex;
        for(UINT i=0; i<forestSize; i++){
            
            file >> word;
            if(word != "Tree:"){
                errorLog << "loadModelFromFile(string filename) - Could not find the Tree Header!" << endl;
                return false;
            }
            file >> treeIndex;
            
            if( treeIndex != i+1 ){
                errorLog << "loadModelFromFile(string filename) - Incorrect tree index: " << treeIndex << endl;
                return false;
            }
            
            //Create a new DTree
            DecisionTreeNode *tree = new DecisionTreeNode;
            
            if( tree == NULL ){
                errorLog << "loadModelFromFile(fstream &file) - Failed to create new Tree!" << endl;
                return false;
            }
            
            tree->setParent( NULL );
            if( !tree->loadFromFile( file ) ){
                errorLog << "loadModelFromFile(fstream &file) - Failed to load tree from file!" << endl;
                return false;
            }
            
            //Add the tree to the forest
            forest.push_back( tree );
        }
    }
    
    return true;
}