/* * 最大最大激励化 第 unitdx 个单元 * */ double LayerWiseRBMs::maximizeUnit(int layerIdx, int unitIdx, double * unitSample, double argvNorm, int epoch){ int AMnumIn = layers[0]->numVis; // unitsample 归一化 double curNorm = squareNorm(unitSample, AMnumIn, 1); cblas_dscal(AMnumIn, argvNorm / curNorm, unitSample, 1); double maxValue =0; for(int k=0; k<epoch; k++){ // forward for(int i=0; i<=layerIdx; i++){ if(i==0) layers[i]->setInput(unitSample); else layers[i]->setInput(layers[i-1]->getOutput()); layers[i]->setBatchSize(1); layers[i]->runBatch(); } maxValue = layers[layerIdx]->getOutput()[unitIdx]; //back propagate for(int i=layerIdx; i>=0; i--){ if(i==layerIdx) layers[i]->getAMDelta(unitIdx, NULL) ; else layers[i]->getAMDelta(-1, layers[i+1]->AMDelta); } double lr = 0.01 * cblas_dasum(AMnumIn, unitSample, 1) / cblas_dasum(AMnumIn, layers[0]->AMDelta, 1); // update unitSample cblas_daxpy(AMnumIn, lr, layers[0]->AMDelta, 1, unitSample, 1); //归一化 unitSample curNorm = squareNorm(unitSample, AMnumIn, 1); cblas_dscal(AMnumIn, argvNorm / curNorm, unitSample, 1); } return maxValue; }
/** * Return inverse quaternion. In case of normalized quaternion: use conjugate method to get same result with better performance. */ template<class T> Quaternion<T> Quaternion<T>::inverse() const { T squaredNorm = squareNorm(); return Quaternion<T>(-X/squaredNorm, -Y/squaredNorm, -Z/squaredNorm, W/squaredNorm); }