def update_tensor_decision_mps_gradient_algo(self, nt, time_r=5, threshold=0, step=0.2): self.update_tensor_decision_mps_svd(nt) for t in range(0, time_r): d_tensor = np.zeros(self.tensors[nt].shape) for n in self.remaining_samples_train: v1 = tm.absorb_vectors2tensors( self.tensors[nt], (self.v_ctr_train[n], self.vecsImages[n][:, nt]), (0, 1)) norm = np.linalg.norm(v1) fid = self.fun_fidelity(v1 / norm) fid_now = fid[self.classes.index(self.LabelNow[n])] fid = [fid[nn] / fid_now for nn in range(0, self.num_classes)] fid.pop(self.classes.index(self.LabelNow[n])) if max(fid) > threshold: tmp = np.kron(np.kron(self.v_ctr_train[n], self.vecsImages[n][:, nt]), self.vLabel[self.classes.index(self.LabelNow[n])]) \ / (fid_now * norm) d_tensor += tmp.reshape(self.tensors[nt].shape) d_tensor -= self.tensors[nt] norm = np.linalg.norm(d_tensor.reshape(-1, )) if norm > 1e-10: d_tensor /= norm self.tensors[nt] = self.tensors[nt] + step * d_tensor self.tensors[nt] /= np.linalg.norm(self.tensors[nt].reshape(-1, ))
def update_tensor_decision_mps_svd_threshold_algo(self, nt, time_r=5, threshold=0.9): self.update_tensor_decision_mps_svd(nt) env = 0 d0 = self.v_ctr_train[0].shape[0] d1 = self.vecsImages[0][:, nt].shape[0] for t in range(0, time_r): for n in self.remaining_samples_train: v1 = tm.absorb_vectors2tensors( self.tensors[nt], (self.v_ctr_train[n], self.vecsImages[n][:, nt]), (0, 1)) norm = np.linalg.norm(v1) fid = self.fun_fidelity(v1 / norm) fid_now = fid[self.classes.index(self.LabelNow[n])] fid = [fid[nn] / fid_now for nn in range(0, self.num_classes)] fid.pop(self.classes.index(self.LabelNow[n])) if max(fid) > threshold: env += np.kron( np.kron(self.v_ctr_train[n], self.vecsImages[n][:, nt]), self.vLabel[self.classes.index(self.LabelNow[n])]) u, self.lm[nt], v = np.linalg.svd( (env / np.linalg.norm(env.reshape(-1, ))).reshape( d0 * d1, self.chi), full_matrices=False) self.tensors[nt] = u.dot(v).reshape([d0, d1, self.chi]) self.lm[nt] /= np.linalg.norm(self.lm[nt])
def fidelity_mps_image(self, mps_ref, ni): # Calculate the fidelity between an MPS and one image fid = 0 length = mps_ref.__len__() v0 = np.ones((1, )) image = self.vecsImages[ni] for n in range(0, self.length): v0 = tm.absorb_vectors2tensors(mps_ref[n], (v0, image[:, n]), (0, 1)) norm = np.linalg.norm(v0) v0 /= norm fid -= np.log(norm) / length return fid
def update_v_ctr_test(self, nt): for n in self.remaining_samples_test: self.v_ctr_test[n] = tm.absorb_vectors2tensors( self.tensors[nt], (self.v_ctr_test[n], self.vecsTest[:, nt, n]), (0, 1)) self.v_ctr_test[n] /= np.linalg.norm(self.v_ctr_test[n])
def update_v_ctr_train(self, nt): for n in self.remaining_samples_train: self.v_ctr_train[n] = tm.absorb_vectors2tensors( self.tensors[nt], (self.v_ctr_train[n], self.vecsImages[n][:, nt]), (0, 1)) self.v_ctr_train[n] /= np.linalg.norm(self.v_ctr_train[n])