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])
Beispiel #3
0
 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
Beispiel #4
0
 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])
Beispiel #5
0
 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])