Пример #1
0
    def evaluation(trainer=None):
        def _l2normalize(v, eps=1e-12):
            return v / (((v**2).sum())**0.5 + eps)

        xp = dis.xp
        links = [[name, link] for name, link in sorted(dis.namedlinks())]
        sigmas = []
        for name, link in links:
            if isinstance(link, SNConvolution2D):
                W, u = link.W, link.u
                W_mat = W.reshape(W.shape[0], -1)
                sigma, _, _ = max_singular_value(W_mat, u)
                W_bar = chainer.cuda.to_cpu(
                    (W_mat.data / xp.squeeze(sigma.data)))
                _, s, _ = svd(W_bar)
                _sigma = s[0]
                print(name.strip('/'), _sigma)
                sigmas.append([name.strip('/'), _sigma])

        if dst is not None:
            preview_dir = '{}/sigmas'.format(dst)
            if not os.path.exists(preview_dir):
                os.makedirs(preview_dir)
            preview_path = preview_dir + '/sigmas_{:0>8}.txt'.format(
                trainer.updater.iteration if trainer is not None else None)
            with open(preview_path, 'wb') as f:
                np.savetxt(f,
                           np.array(sigmas, dtype=np.str),
                           delimiter=" ",
                           fmt="%s")
Пример #2
0
 def W_bar(self):
     """
     Spectrally Normalized Weight
     """
     if self.n % self.ncritic == 0:
         W_mat = self.W.reshape(self.W.shape[0], -1)
         xp = cuda.get_array_module(W_mat.data)
         U, s, V = xp.linalg.svd(W_mat.data, full_matrices=True)
         s = s / max(s)
         S_shape = min(W_mat.data.shape)
         half_shape = S_shape // 2
         s[:half_shape] = xp.ones(half_shape)
         S = xp.zeros(W_mat.data.shape)
         S[:S_shape, :S_shape] = xp.diag(s)
         W_mat.data = xp.dot(U, xp.dot(S, V))
         self.W.copydata(W_mat.reshape(self.W.shape))
         self.n = 1
         return self.W
     else:
         self.n += 1
         W_mat = self.W.reshape(self.W.shape[0], -1)
         sigma, _u, _ = max_singular_value(W_mat, self.u, self.Ip)
         if self.factor:
             sigma = sigma / self.factor
         sigma = broadcast_to(sigma.reshape((1, 1, 1, 1)), self.W.shape)
         if chainer.config.train:
             # Update estimated 1st singular vector
             self.u[:] = _u
         if hasattr(self, 'gamma'):
             return broadcast_to(self.gamma, self.W.shape) * self.W / sigma
         else:
             return self.W / sigma
Пример #3
0
 def W_bar(self):
     """
     Spectral Normalized Weight
     """
     sigma, _u, _ = max_singular_value(self.W, self.u, self.Ip)
     if self.factor:
         sigma = sigma / self.factor
     sigma = broadcast_to(sigma.reshape((1, 1)), self.W.shape)
     self.u[:] = _u
     return self.W / sigma
 def W_bar(self):
     """
     Spectral Normalized Weight
     """
     sigma, _u, _ = max_singular_value(self.W_sym, self.u, self.Ip)
     sigma = broadcast_to(sigma.reshape((1, 1)), self.W_sym.shape)
     self.u = _u
     if hasattr(self, 'gamma'):
         return broadcast_to(self.gamma,
                             self.W_sym.shape) * self.W_sym / sigma
     else:
         return self.W_sym / sigma
 def W_bar(self):
     """
     Spectral Normalized Weight
     """
     xp = cuda.get_array_module(self.W.data)
     W_mat = self.W.reshape(self.W.shape[0], -1)
     sigma, _u, _ = max_singular_value(W_mat, self.u, self.Ip)
     sigma = self.ratio * sigma if self.ratio is not None else sigma
     sigma = broadcast_to(sigma.reshape((1, 1, 1, 1)), self.W.shape)
     self.u = _u
     if hasattr(self, 'gamma'):
         return broadcast_to(self.gamma, self.W.shape) * self.W / sigma
     else:
         return self.W / sigma
Пример #6
0
 def W_bar(self):
     """
     Spectral Normalized Weight
     """
     sigma, _u, _ = max_singular_value(self.W, self.u, self.Ip)
     if self.factor:
         sigma = sigma / self.factor
     sigma = broadcast_to(sigma.reshape((1, 1)), self.W.shape)
     if chainer.config.train:
         self.u[:] = _u
     if hasattr(self, 'gamma'):
         return broadcast_to(self.gamma, self.W.shape) * self.W / sigma
     else:
         return self.W / sigma
Пример #7
0
    def W_bar(self):
        """
        Spectral Normalized Weight
        """
        W_mat = self.W.reshape(self.W.shape[0], -1)
        sigma, _u, _ = max_singular_value(W_mat, self.u, self.Ip)
        if self.factor:
            sigma = sigma / self.factor
        sigma = broadcast_to(sigma.reshape([1] * len(self.W.shape)), self.W.shape)
        self.u[:] = _u

        if hasattr(self, 'gamma'):
            return broadcast_to(self.gamma, self.W.shape) * self.W / sigma
        else:
            return self.W / sigma
Пример #8
0
 def W_bar(self):
     """
     Spectrally Normalized Weight
     """
     xp = cuda.get_array_module(self.W.data)
     W_mat = self.W.reshape(self.W.shape[0], -1)
     sigma, _u, _ = max_singular_value(W_mat, self.u, self.Ip)
     if self.factor:
         sigma = sigma / self.factor
     sigma = broadcast_to(sigma.reshape((1, 1, 1, 1)), self.W.shape)
     self.u[:] = _u
     if hasattr(self, 'gamma'):
         return broadcast_to(self.gamma, self.W.shape) * self.W / sigma
     else:
         return self.W / sigma
Пример #9
0
 def W_bar(self):
     """
     Spectrally Normalized Weight
     """
     W_mat = self.W.reshape(self.W.shape[0], -1)
     sigma, _u, _ = max_singular_value(W_mat, self.u, self.Ip)
     if self.factor:
         sigma = sigma / self.factor
     sigma = broadcast_to(sigma.reshape((1, 1, 1, 1)), self.W.shape)
     if chainer.config.train:
         # Update estimated 1st singular vector
         self.u[:] = _u
     if hasattr(self, 'gamma'):
         return broadcast_to(self.gamma, self.W.shape) * self.W / sigma
     else:
         return self.W / sigma