// convertion void mat2Blob(mat& mA, shared_ptr<Blob>& out, int c, int h, int w) { int n = mA.n_rows; assert(mA.n_cols == c*h*w); mA = mA.t(); if (out) { out.reset(); } out.reset(new Blob(n, c, h, w)); for (int i = 0; i < n; ++i) { (*out)[i] = cube(mA.colptr(i), h, w, c); } return; }
void update(const record & rcd) { unsigned int i = rcd.user - 1, j = rcd.movie - 1; double r_pFpX; double *Ui = U.colptr(i); double *Vj = V.colptr(j); double UiVj = fang_mul(Ui, Vj, K); r_pFpX = learning_rate_per_record * 2.0 * (rcd.score - mu - (UiVj + A(i) + B(j))); // U(:,i) = U(:,i) - rate * gUi; gUi = - pFpX * V(:,j); fang_add_mul(Ui, Vj, r_pFpX, K); // V(:,j) = V(:,j) - rate * gVj; gVj = - pFpX * U(:,i); fang_add_mul(Vj, Ui, r_pFpX, K); // A(:,i) = A(:,i) - rate * gAi; gAi = - pFpX; A(i) += r_pFpX; // B(:,j) = B(:,j) - rate * gBj; gBj = - pFpX; B(j) += r_pFpX; }
void mat2Blob(mat& mA, shared_ptr<Blob>& out, const vector<int>& sz) { int n = mA.n_rows; int c = sz[1]; int h = sz[2]; int w = sz[3]; assert(mA.n_cols == c*h*w); mA = mA.t(); if (out) { out.reset(); } out.reset(new Blob(n, c, h, w)); for (int i = 0; i < n; ++i) { (*out)[i] = cube(mA.colptr(i), h, w, c); } return; }