From 91342732dd94dc41835e249970090c4fb2761d80 Mon Sep 17 00:00:00 2001 From: Holger Schwenk Date: Fri, 10 Jul 2015 06:45:37 +0200 Subject: [PATCH] corrected bug when using lrate DevideAndRecover --- Lrate.cpp | 2 ++ Mach.cpp | 29 +++++++++++++++++------------ Mach.h | 9 +++++++-- MachLin.cpp | 2 ++ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Lrate.cpp b/Lrate.cpp index da9255f..8848868 100644 --- a/Lrate.cpp +++ b/Lrate.cpp @@ -222,7 +222,9 @@ bool LrateDivideAndRecover::UpdateLrateOnDev(REAL rErrDev, REAL rBestErrDev, con printf("error: %s\n", strerror(errno)); else { // reload previous best machine parameters + Mach::SetShareOffs(random()); // use a new shareOffs since we have one globale table Mach* pPrevMach = Mach::Read(ifs); + Mach::SetShareOffs(0); // reset if ( (pMach->GetNbForw () >= pPrevMach->GetNbForw ()) && (pMach->GetNbBackw() >= pPrevMach->GetNbBackw()) && pMach->CopyParams(pPrevMach) ) diff --git a/Mach.cpp b/Mach.cpp index a12e7de..4b103f8 100644 --- a/Mach.cpp +++ b/Mach.cpp @@ -45,6 +45,7 @@ using namespace std; vector signal_mach; int Mach::fileid=-1; std::map prSharedMachines; // to store Mach pointers for sharing using clone() function +int shareOffs=0; // used to separate several machine loaded by multiple calls of Mach::Read() #ifdef BLAS_CUDA # include "Blas.h" @@ -262,6 +263,7 @@ Mach *Mach::Read(istream &inpf, int bs) char header[file_header_size], h[file_header_size]; int v; + debug1("###### READ with shareOffs %d\n",shareOffs); inpf.read(header,file_header_size); if (sscanf(header,"%s %d",h,&v) != 2) { ErrorN("format of machine file not recognised: %s", header); @@ -338,28 +340,30 @@ Mach *Mach::Read(istream &inpf, int bs) // if version > 3 then check share-id if(Mach::fileid >= file_header_version3){ m->ReadData(inpf, s, bs); - if(prSharedMachines[mt->GetShareId()] == NULL){ - //fprintf(stderr, " ... new primary MachTab with share-id %d\n", mt->GetShareId()); - prSharedMachines[mt->GetShareId()] = mt; + int shID = shareOffs+mt->GetShareId(); + if(prSharedMachines[shID] == NULL){ + //fprintf(stderr, " ... new primary MachTab with share-id %d\n", shID); + prSharedMachines[shID] = mt; if(mt->GetTabAdr() == NULL) { Error("Mach::Read: machine should have its weights allocated!\n"); } } else { - //fprintf(stderr, " ... cloning secondary MachTab with share-id %d\n", mt->GetShareId()); - m = prSharedMachines[mt->GetShareId()]->Clone(); + //fprintf(stderr, " ... cloning secondary MachTab with share-id %d\n", shID); + m = prSharedMachines[shID]->Clone(); } } else { // before file_header_version3, all MachTab in a MachPar share the weights - if(prSharedMachines[-1] == NULL ){ + int shID = shareOffs + -1; + if(prSharedMachines[shID] == NULL ){ if(mt->bExternal==0) m->ReadData(inpf, s, bs); //read the data for the first MachTab else{ Error("The first MachTab should have its own data but is set to have external data\n"); } debug2("Storing address (%p) of machine %d\n",mt->GetTabAdr(),m); - prSharedMachines[-1]=m; + prSharedMachines[shID]=m; } else { - m = prSharedMachines[-1]->Clone(); + m = prSharedMachines[shID]->Clone(); debug1(" cloning MachTab, address = %p\n", mt->GetTabAdr()); //fprintf(stderr, " cloning MachTab, address = %p\n", mt->GetTabAdr()); } @@ -368,18 +372,19 @@ Mach *Mach::Read(istream &inpf, int bs) else if(Mach::fileid >= file_header_version4 && Mach::canShare(mtype)) { //fprintf(stderr, "Shareable machine mtype = %d\n", mtype); Shareable* sharem = dynamic_cast(m); + int shID = shareOffs + sharem->GetShareId(); //fprintf(stderr, "Shareable: external=%d share-id=%d\n", sharem->HasExternalData(), sharem->GetShareId()); if(sharem->HasExternalData()){ - if(prSharedMachines[sharem->GetShareId()] != NULL){ + if(prSharedMachines[shID] != NULL){ //fprintf(stderr, " ... secondary machine with share-id %d -> cloning primary machine\n", sharem->GetShareId()); - m = (MachLin*)prSharedMachines[sharem->GetShareId()]->Clone(); + m = (MachLin*)prSharedMachines[shID]->Clone(); } else { ErrorN("Found a secondary machine with shareid=%d, but the primary machine is not yet created\n", sharem->GetShareId()); } } else { - if(sharem->GetShareId() != -1){ + if(sharem->GetShareId() != shareOffs + -1){ //fprintf(stderr, " ... new primary machine with share-id %d\n", sharem->GetShareId()); - prSharedMachines[sharem->GetShareId()] = m; + prSharedMachines[shID] = m; } //else { fprintf(stderr, " ... new primary machine with no sharing\n"); } m->ReadData(inpf, s, bs); diff --git a/Mach.h b/Mach.h index 8b1b539..a9928df 100644 --- a/Mach.h +++ b/Mach.h @@ -62,6 +62,7 @@ #define file_header_mtype_max 32 #define file_header_mtype_avr 33 +extern int shareOffs; class Mach { private: @@ -152,8 +153,12 @@ class Mach static int GetFileId(){ return fileid;} static void SetFileId(int id){ fileid = id;} - static bool canShare(int mtype){ return (mtype>=1 && mtype<=6) || (mtype>=8 && mtype<=10); } - + static bool canShare(int mtype) { + return (mtype != file_header_mtype_base + && mtype != file_header_mtype_stab + && mtype <= file_header_mtype_softmax_class); + } + static void SetShareOffs(int val) { shareOffs = val; } }; void GpuUnlock(); diff --git a/MachLin.cpp b/MachLin.cpp index 04d0466..2bd20f5 100644 --- a/MachLin.cpp +++ b/MachLin.cpp @@ -339,10 +339,12 @@ bool MachLin::CopyParams(Mach* mach) memcpy(this->b, machlin->b, odim * sizeof(REAL)); memcpy(this->w, machlin->w, idim * odim * sizeof(REAL)); #endif +/* if(Mach::fileid >= file_header_version4) { this->bExternal = machlin->bExternal; this->iShareId = machlin->iShareId; } +*/ return true; } else