在卷积神经网络的训练中,因为多个卷积核做卷积的时候互不干扰,可以并行。
直观的方法是采用多线程做卷积,每个线程负责一个featureMap的卷积计算。
在本人的程序中,多线程训练比单线程训练大约要快3倍。
工程名Dlg.cpp (CCNN2Dlg.cpp)文件中,写好线程函数,第几个featureMap做卷积通过参数LPVOID lpPara指定。
DWORD WINAPI ConvolFun1(LPVOID lpPara) { int i,j,ii,jj,k; k = (int)lpPara; for(i=0;i<=28-filter1[0].nSize;i++) { for(j=0;j<=28-filter1[0].nSize;j++) { float tempSum=0; for(ii=0;ii<filter1[0].nSize;ii++) { for(jj=0;jj<filter1[0].nSize;jj++) { tempSum+=filter1[k].mFactor[ii][jj]*pic[(i+ii)*28+(j+jj)]; } } float tempu=tempSum+filter1[k].bias;; fm1[k].picMatrix[i*fm1[k].nSize+j]=tanh(tempu);//1.0/(1.0+exp(-tempu)); } } return NULL; }
在单个CNN训练的前向过程中调用:
void CCNN2Dlg::cnnForward() { int i,j,k,ii,jj,kk; //卷积层1 HANDLE hThread[F1K];//设置F1K个句柄 for(k=0;k<F1K;k++) { hThread[k] = CreateThread(NULL, 0, ConvolFun1, LPVOID(k), 0, NULL); //开辟F1K个线程,线程的执行函数为ConvolFun1,参数为k } for(k=0;k<F1K;k++) { WaitForSingleObject(hThread[k],INFINITE);//等待各线程执行完返回 CloseHandle(hThread[k]); //线程结束后一定要关闭句柄,不然程序会越跑越慢,句柄也是一种资源,用完要关闭释放 } 。。。。 }
关于mfc环境下的多线程的学习,参看:
http://wenku.baidu.com/view/55660d6548d7c1c708a14500.html
原文地址:http://blog.csdn.net/hzq20081121107/article/details/38924969