def _train_patches(self,partsRegion,shape):
     ORI = self._rotation
     def cycles(X):
         return np.asarray([np.concatenate([X[i:],X[:i]]) for i in xrange(len(X))])
     RR = np.arange(ORI)
     POL = 1
     PP = np.arange(POL)
     II = [list(itr.product(PPi, RRi)) for PPi in cycles(PP) for RRi in cycles(RR)]
     lookup = dict(zip(itr.product(PP,RR),itr.count()))
     num_angle = self._rotation
     d = np.prod(shape)
     permutation = np.empty((num_angle, num_angle * d), dtype = np.int_)
     for a in range(num_angle):
         if a == 0:
             permutation[a] = np.arange(num_angle * d)
         else:
             permutation[a] = np.roll(permutation[a-1], -d)
     from pnet.bernoulli import em
     mm_models = []
     for i in range(self._num_lower_parts//self._rotation):
         block = partsRegion[i]
         ret = em(block.reshape((block.shape[0],-1)),self._num_components, 10, permutation = permutation, numpy_rng = 0, verbose = True)
         mu = ret[1].reshape((self._num_components * self._rotation, ) + shape)
         mm_models.append(mu)
     self._models = np.asarray(mm_models)
    def train_from_samples(self, patches,num_parts):
        #from pnet.latent_bernoulli_mm import LatentBernoulliMM
        from pnet.bernoullimm import BernoulliMM
        min_prob = self._settings.get('min_prob', 0.01)
        flatpatches = patches.reshape((patches.shape[0], -1))
        parts = np.ones((num_parts,) + patches.shape[1:])
        if 0:
            mm = BernoulliMM(n_components=num_parts, n_iter=20, tol=1e-15,n_init=2, random_state=0, min_prob=min_prob, verbose=False)
            print(mm.fit(flatpatches))
            print('AIC', mm.aic(flatpatches))
            print('BIC', mm.bic(flatpatches))
            #import pdb; pdb.set_trace()
            parts = mm.means_.reshape((num_parts,)+patches.shape[1:])
            #self._weights = mm.weights_
        else:
            
            from pnet.bernoulli import em
            ret = em(flatpatches, num_parts,20,numpy_rng=self._settings.get('em_seed',0),verbose=True)
            parts = ret[1].reshape((num_parts,) + patches.shape[1:])
            self._weights = np.arange(self._num_parts)

            #self._weights = mm.weights
            
        # Calculate entropy of parts
        Hall = (parts * np.log(parts) + (1 - parts) * np.log(1 - parts))
        H = -np.apply_over_axes(np.mean, Hall, [1, 2, 3])[:,0,0,0]

        # Sort by entropy
        II = np.argsort(H)

        parts[:] = parts[II]
        #self._train_info['entropy'] = H[II]
        return parts
    def _train(self, phi, data, y):
        X_n = phi(data)
        X = X_n[0]
        num_parts = X_n[1]
        num_orientations = X_n[2]
        num_true_parts = num_parts // num_orientations

        self._extra['training_comp'] = []

        K = int(y.max()) + 1

        mm_models = []

        for k in range(K):
            Xk = X[y == k]
            assert Xk.shape[-1] == 1

            from pnet.cyfuncs import index_map_pooling_multi

            # Rotate all the Xk samples

            print('A')
            XB = index_map_pooling_multi(Xk, num_parts, (1, 1), (1, 1))
            print('B')
            XB = XB.reshape(XB.shape[:-1] + (num_true_parts, num_orientations))

            blocks = []

            print('C')
            for ori in range(0, self._n_orientations):
                angle = ori / self._n_orientations * 360
                # Rotate all images, apply rotational spreading, then do
                # pooling

                from pnet.cyfuncs import rotate_index_map_pooling

                sr = self._pooling_settings.get('rotation_spreading_radius', 0)
                yy1 = rotate_index_map_pooling(Xk[..., 0], angle, sr,
                                               num_orientations,
                                               num_parts,
                                               self._pooling_settings['shape'])

                sh = yy1.shape[:3] + (num_orientations, num_true_parts)
                yy = yy1.reshape(sh)

                blocks.append(yy)

            blocks = np.asarray(blocks).transpose((1, 0, 2, 3, 4, 5))
            print('D')

            """
            from pnet.vzlog import default as vz

            import gv

            for i in range(self._n_orientations):
                gv.img.save_image(vz.impath(), blocks[0, i, :, :, 0].sum(-1))

            vz.finalize()
            """

            shape = blocks.shape[2:4] + (np.prod(blocks.shape[4:]),)

            # Flatten
            blocks = blocks.reshape(blocks.shape[:2] + (-1,))

            n_init = self._settings.get('n_init', 1)
            n_iter = self._settings.get('n_iter', 10)
            seed = self._settings.get('seed', 0)

            ORI = self._n_orientations
            POL = 1

            def cycles(X):
                return np.asarray([np.concatenate([X[i:], X[:i]])
                                   for i in range(len(X))])

            RR = np.arange(ORI)
            PP = np.arange(POL)
            II = [list(itr.product(PPi, RRi))
                  for PPi in cycles(PP)
                  for RRi in cycles(RR)]
            lookup = dict(zip(itr.product(PP, RR), itr.count()))
            permutations = [[lookup[ii] for ii in rows] for rows in II]
            permutations = np.asarray(permutations)

            print('E')

            if 1:
                mm = PermutationMM(n_components=self._n_components,
                                   permutations=permutations,
                                   n_iter=n_iter,
                                   n_init=n_init,
                                   random_state=seed,
                                   min_probability=self._min_prob)
                mm.fit(blocks)
                comps = mm.predict(blocks)
                mu_shape = (self._n_components * self._n_orientations,) + shape
                mu = mm.means_.reshape(mu_shape)

            else:
                num_angle = self._n_orientations
                d = np.prod(shape)
                sh = (num_angle, num_angle * d)
                permutation = np.empty(sh, dtype=np.int_)
                for a in range(num_angle):
                    if a == 0:
                        permutation[a] = np.arange(num_angle * d)
                    else:
                        permutation[a] = np.roll(permutation[a-1], -d)

                from pnet.bernoulli import em


                XX = blocks.reshape((blocks.shape[0], -1))
                print('F Digit:', d)
                ret = em(XX, self._n_components, n_iter,
                         permutation=permutation, numpy_rng=seed,
                         verbose=True)
                print('G')

                comps = ret[3]

                self._extra['training_comp'].append(ret[3])

                mu = ret[1].reshape((self._n_components * self._n_orientations,) + shape)

            if 0: # Build visualizations of all rotations

                ims10k = self._data
                label10k = y

                ims10k_d = ims10k[label10k == d]

                rot_ims10k = np.asarray([[rotate(im, -rot, resize=False) for rot in np.arange(n_orientations) * 360 / n_orientations] for im in ims10k_d])

                vispart_blocks = []

                for phase in range(n_orientations):
                    visparts = np.asarray([
                        rot_ims10k[comps[:, 0]==k, comps[comps[:, 0]==k][:, 1]].mean(0) for k in range(n_comp)
                    ])

                    M = 50

                    grid0 = pnet.plot.ImageGrid(n_comp, min(M, np.max(map(len, XX))), ims10k.shape[1:])
                    for k in range(n_comp):
                        for i in range(min(M, len(XX[k]))):
                            grid0.set_image(XX[k][i], k, i, vmin=0, vmax=1, cmap=cm.gray)
                    grid0.save(vz.impath(), scale=3)

                    for k in range(n_comp):
                        grid.set_image(visparts[k], d, k, vmin=0, vmax=1, cmap=cm.gray)




            mm_models.append(mu)
            print('H')


        self._models = np.asarray(mm_models)
    def _train(self, phi, data, y):
        import types
        if isinstance(data, types.GeneratorType):
            Xs = []
            c = 0
            for i, batch in enumerate(data):
                Xi = phi(batch)
                Xs.append(Xi)
                c += Xi.shape[0]
                ag.info('SVM: Has extracted', c)

            X = np.concatenate(Xs, axis=0)
        else:
            X = phi(data)

        K = y.max() + 1
        mm_models = []
        mm_comps = []
        mm_weights = []
        S = self._settings.get('standardize')
        if S:
            self._means = np.zeros((K, self._n_components))
            self._sigmas = np.zeros((K, self._n_components))

        for k in range(K):
            Xk = X[y == k]
            Xk = Xk.reshape((Xk.shape[0], -1))

            if 1:
                mm = BernoulliMM(n_components=self._n_components,
                                 n_iter=10,
                                 n_init=1,
                                 thresh=1e-5,
                                 random_state=self._settings.get('seed', 0),
                                 min_prob=self._min_prob,
                                 blocksize=200,
                                 verbose=True)
                mm.fit(Xk)

                comps = mm.predict(Xk)
                weights = mm.weights_

                mu = mm.means_.reshape((self._n_components,)+X.shape[1:])
            else:
                from pnet.bernoulli import em
                ret = em(Xk, self._n_components, 10,
                         numpy_rng=self._settings.get('seed', 0),
                         verbose=True)

                mu = ret[1].reshape((self._n_components,)+X.shape[1:])
                comps = ret[3]
                weights = np.exp(ret[0])
                print('--weights', weights)
                weights /= weights.sum()
            mm_models.append(mu)
            mm_comps.append(comps)
            mm_weights.append(weights)

            np.set_printoptions(precision=2, suppress=True)
            print('Weights:', weights)
            print('Weights sorted:', np.sort(weights)[::-1])

            # Add standardization
            if S:
                self._means[k] = np.apply_over_axes(np.sum,
                                                    mu * logit(mu),
                                                    [1, 2, 3]).ravel()
                sig = np.apply_over_axes(np.sum,
                                         logit(mu)**2 * mu * (1 - mu),
                                         [1, 2, 3]).ravel()
                self._sigmas[k] = np.sqrt(sig)

        self._extra['comps'] = mm_comps
        self._extra['weights'] = mm_weights
        self._models = np.asarray(mm_models)
    def train_from_samples(self, patches, original_patches):
        # from pnet.latent_bernoulli_mm import LatentBernoulliMM
        from pnet.bernoullimm import BernoulliMM

        print(patches.shape)
        min_prob = self._settings.get("min_prob", 0.01)
        # num_permutation = self._shifting_shape[0] * self._shifting_shape[1]
        # parts = np.ones((self._num_true_parts * num_permutation ,) + patches.shape[2:])
        parts = np.ones((self._num_parts,) + patches[0].shape)
        d = np.prod(patches.shape[1:])
        # print(d,num_permutation)
        if 0:
            # \permutation = np.empty((num_permutation, num_permutation * d),dtype = np.int_)
            for a in range(num_permutation):
                if a == 0:
                    permutation[a] = np.arange(num_permutation * d)
                else:
                    permutation[a] = np.roll(permutation[a - 1], d)
        flatpatches = patches.reshape((patches.shape[0], -1))
        print(flatpatches.shape)
        if 0:
            mm = BernoulliMM(
                n_components=num_parts, n_iter=20, tol=1e-15, n_init=2, random_state=0, min_prob=min_prob, verbose=False
            )
            print(mm.fit(flatpatches))
            print("AIC", mm.aic(flatpatches))
            print("BIC", mm.bic(flatpatches))
            # import pdb; pdb.set_trace()
            parts = mm.means_.reshape((num_parts,) + patches.shape[1:])
            # self._weights = mm.weights_
        elif 0:

            from pnet.bernoulli import em

            print("before EM")

            ret = em(
                flatpatches,
                self._num_true_parts,
                10,
                mu_truncation=min_prob,
                permutation=permutation,
                numpy_rng=self._settings.get("em_seed", 0),
                verbose=True,
            )
            comps = ret[3]
            parts = ret[1].reshape((self._num_true_parts * num_permutation,) + patches.shape[2:])
            self._weights = np.arange(self._num_parts)
        else:
            rng = np.random.RandomState(self._settings.get("em_seed", 0))
            from pnet.latentShiftEM import LatentShiftEM

            # from latentShiftEM import latentShiftEM
            result = LatentShiftEM(
                flatpatches,
                num_mixture_component=self._num_parts,
                parts_shape=(self._part_shape[0], self._part_shape[1], 8),
                region_shape=(self._sample_shape[1], self._sample_shape[1], 8),
                shifting_shape=self._shifting_shape,
                max_num_iteration=25,
                loglike_tolerance=1e-3,
                mu_truncation=(1, 1),
                additional_mu=None,
                permutation=None,
                numpy_rng=rng,
                verbose=True,
            )
            comps = result[3]
            print(comps.shape)
            print(original_patches.shape)
            print(result[1].shape)
            parts = result[1].reshape((self._num_parts, self._part_shape[0], self._part_shape[1], 8))
            self._bkg_probability = result[4]
        self._parts = parts
        print(comps[:50, 0])
        print(comps[:50, 1])
        self._visparts = np.asarray(
            [original_patches[comps[:, 0] == k, comps[comps[:, 0] == k][:, 1]].mean(0) for k in range(self._num_parts)]
        )
        print(self._visparts.shape)
        import amitgroup.plot as gr

        gr.images(self._visparts, zero_to_one=False, show=False, vmin=0, vmax=1, fileName="moduleShiftingParts1.png")
        return parts
Exemple #6
0
    def train_from_samples(self, patches,patches_original):
        #from pnet.latent_bernoulli_mm import LatentBernoulliMM
        from pnet.bernoullimm import BernoulliMM
        min_prob = self._settings.get('min_prob', 0.01)
        flatpatches = patches.reshape((patches.shape[0], -1))
        
        if 1:
            mm = BernoulliMM(n_components=self._num_parts, n_iter=20, tol=1e-15,n_init=2, random_state=self._settings.get('em_seed',0), min_prob=min_prob, verbose=False)
            mm.fit(flatpatches)
            print(mm.fit(flatpatches))
            #print('AIC', mm.aic(flatpatches))
            #print('BIC', mm.bic(flatpatches))
            
            if 0:
                # Draw samples
                #size = (20, 20)
                import gv
                import os
                N = 10000
                D = np.prod(self._part_shape)
                size = (20, 20)
                grid = gv.plot.ImageGrid(size[0], size[1], self._part_shape)
                samp = mm.sample(n_samples=np.prod(size)).reshape((-1,) + self._part_shape)
                samples = mm.sample(n_samples=N).reshape((-1,) + self._part_shape)
                print('samples', samples.shape)

                types = np.asarray(list(gv.multirange(*[2]*D))).reshape((-1,) + self._part_shape)
                th = np.clip(types, 0.01, 0.99)

                t = th[:,np.newaxis]
                x = samples[np.newaxis]

                llh0 = x * np.log(t) + (1 - x) * np.log(1 - t)
                counts0 = np.bincount(np.argmax(llh0.sum(-1).sum(-1), 0), minlength=th.shape[0])
                
                x1 = patches[np.newaxis,...,0]
                llh1 = x1 * np.log(t) + (1 - x1) * np.log(1 - t)
                counts1 = np.bincount(np.argmax(llh1.sum(-1).sum(-1), 0), minlength=th.shape[0])

                #import pdb; pdb.set_trace()

                w0 = counts0 / counts0.sum()
                w1 = counts1 / counts1.sum()

                print('w0', w0)
                print('w1', w1) 
                #import pdb; pdb.set_trace()


            #import pdb; pdb.set_trace()
            self._parts = mm.means_.reshape((self._num_parts,)+patches.shape[1:])
            self._weights = mm.weights_
        else:
            #mm = ag.stats.BernoulliMixture(self._num_parts, flatpatches, max_iter=2000)
            #mm.run_EM(1e-6, min_probability=min_prob)
            #self._parts = mm.templates.reshape((self._num_parts,)+patches.shape[1:])
            #self._weights = mm.weights
            from pnet.bernoulli import em
            ret = em(flatpatches, self._num_parts,20,numpy_rng=self._settings.get('em_seed',0),verbose=True)
            self._parts = ret[1].reshape((self._num_parts,) + patches.shape[1:])
            self._weights = np.arange(self._num_parts)
        if 0:
            predictedGroups = mm.predict(flatpatches) 
        
        # Calculate entropy of parts
        Hall = (self._parts * np.log(self._parts) + (1 - self._parts) * np.log(1 - self._parts))
        H = -np.apply_over_axes(np.mean, Hall, [1, 2, 3])[:,0,0,0]
    def train_from_samples(self, raw_patches, raw_originals):
        min_prob = self._settings.get('min_prob', 0.01)
        print(raw_patches.shape)
        print(raw_originals.shape)
        ORI = self._num_orientations
        POL = self._settings.get('polarities', 1)
        P = ORI * POL

        def cycles(X):
            return np.asarray([np.concatenate([X[i:], X[:i]]) for i in range(len(X))])

        RR = np.arange(ORI)
        PP = np.arange(POL)
        II = [list(itr.product(PPi, RRi)) for PPi in cycles(PP) for RRi in cycles(RR)]
        lookup = dict(zip(itr.product(PP, RR), itr.count()))
        n_init = self._settings.get('n_init', 1)
        n_iter = self._settings.get('n_iter', 10)
        seed = self._settings.get('em_seed', 0)


        num_angle = ORI
        d = np.prod(raw_patches.shape[2:])
        permutation = np.empty((num_angle, num_angle * d), dtype=np.int_)
        for a in range(num_angle):
            if a == 0:
                permutation[a] = np.arange(num_angle * d)
            else:
                permutation[a] = np.roll(permutation[a-1], d)
    
        from pnet.bernoulli import em      

        X = raw_patches.reshape((raw_patches.shape[0], -1))
        print(X.shape)
        if 1:
            ret = em(X, self._num_true_parts, n_iter,
                     mu_truncation=min_prob,
                     permutation=permutation, numpy_rng=seed,
                     verbose=True)

            comps = ret[3]
            self._parts = ret[1].reshape((self._num_true_parts * P,) + raw_patches.shape[2:])

            if comps.ndim == 1:
                comps = np.vstack([comps, np.zeros(len(comps), dtype=np.int_)]).T

        else:
            
            permutations = np.asarray([[lookup[ii] for ii in rows] for rows in II])

            from pnet.permutation_mm import PermutationMM
            mm = PermutationMM(n_components=self._num_true_parts, permutations=permutations, n_iter=n_iter, n_init=n_init, random_state=seed, min_probability=min_prob)

            Xflat = raw_patches.reshape(raw_patches.shape[:2] + (-1,))
            mm.fit(Xflat)


            comps = mm.predict(Xflat)

            self._parts = mm.means_.reshape((mm.n_components * P,) + raw_patches.shape[2:])

        if 0:
            # Reject some parts
            pp = self._parts[::self._num_orientations]
            Hall = -(pp * np.log2(pp) + (1 - pp) * np.log2(1 - pp))
            H = np.apply_over_axes(np.mean, Hall, [1, 2, 3]).ravel()

            from scipy.stats import scoreatpercentile

            Hth = scoreatpercentile(H, 50)
            ok = H <= Hth

            blocks = []
            for i in range(self._num_true_parts):
                if ok[i]:
                    blocks.append(self._parts[i*self._num_orientations:(i+1)*self._num_orientations])
            
            self._parts = np.concatenate(blocks)
            self._num_parts = len(self._parts)
            self._num_true_parts = self._num_parts // self._num_orientations 

        if 0:
            from pylab import cm
            grid2 = pnet.plot.ImageGrid(self._num_true_parts, 8, raw_originals.shape[2:])
            for n in range(self._num_true_parts):
                for e in range(8):
                    grid2.set_image(self._parts[n * self._num_orientations,...,e], n, e, vmin=0, vmax=1, cmap=cm.RdBu_r)
            grid2.save(vz.generate_filename(), scale=5)

        self._train_info['counts'] = np.bincount(comps[:,0], minlength=self._num_true_parts)

        print(self._train_info['counts'])

        self._visparts = np.asarray([
            raw_originals[comps[:,0]==k,comps[comps[:,0]==k][:,1]].mean(0) for k in range(self._num_true_parts)             
        ])

        if 0:

            XX = [
                raw_originals[comps[:,0]==k,comps[comps[:,0]==k][:,1]] for k in range(self._num_true_parts)             
            ]

            N = 100


            m = self._train_info['counts'].argmax()
            mcomps = comps[comps[:,0] == m]

            raw_originals_m = raw_originals[comps[:,0] == m]

            if 0:
                grid0 = pnet.plot.ImageGrid(N, self._num_orientations, raw_originals.shape[2:], border_color=(1, 1, 1))
                for i in range(min(N, raw_originals_m.shape[0])): 
                    for j in range(self._num_orientations):
                        grid0.set_image(raw_originals_m[i,(mcomps[i,1]+j)%self._num_orientations], i, j, vmin=0, vmax=1, cmap=cm.gray)

                grid0.save(vz.generate_filename(), scale=3)

                grid0 = pnet.plot.ImageGrid(self._num_true_parts, N, raw_originals.shape[2:], border_color=(1, 1, 1))
                for m in range(self._num_true_parts):
                    for i in range(min(N, XX[m].shape[0])):
                        grid0.set_image(XX[m][i], m, i, vmin=0, vmax=1, cmap=cm.gray)
                        #grid0.set_image(XX[i][j], i, j, vmin=0, vmax=1, cmap=cm.gray)

                grid0.save(vz.generate_filename(), scale=3)

                grid1 = pnet.plot.ImageGrid(1, self._num_true_parts, raw_originals.shape[2:], border_color=(1, 1, 1))
                for m in range(self._num_true_parts):
                    grid1.set_image(self._visparts[m], 0, m, vmin=0, vmax=1, cmap=cm.gray)

                grid1.save(vz.generate_filename(), scale=5)
    def train(self, X_n, Y, OriginalX = None):
        X = X_n[0]
        num_parts = X_n[1]
        if(len(X_n) == 3):
            num_orientations = X_n[2]
        else:
            num_orientations = 1
        num_true_parts = num_parts // num_orientations

        self._extra['training_comp'] = []

        K = Y.max() + 1

        mm_models = []
        print(X.shape)
        for k in xrange(K):
            Xk = X[Y == k]

            assert Xk.shape[-1] == 1


            from pnet.cyfuncs import index_map_pooling_multi, orientation_pooling

            # Rotate all the Xk samples

            print('A')
            XB = index_map_pooling_multi(Xk, num_parts, (1, 1), (1, 1))
            print('B')
            XB = XB.reshape(XB.shape[:-1] + (num_true_parts, num_orientations))

            blocks = [] 

            print('C')
            for ori in xrange(0, self._n_orientations):
                angle = ori / self._n_orientations * 360
                # Rotate all images, apply rotational spreading, then do pooling

                if 0:
                    print(ori, 'R{')
                    rots = np.asarray([rotate_patch_map(XB[i], angle) for i in xrange(XB.shape[0])])
                    print(ori, 'R}')


                    print(ori, 'P{')
                    yy = orientation_pooling(rots, 
                                             self._pooling_settings['shape'],
                                             self._pooling_settings['strides'],
                                             self._pooling_settings.get('rotation_spreading_radius', 0))
                    print(ori, 'P}')

                from pnet.cyfuncs import rotate_index_map_pooling 


                if num_orientations !=1:
                    yy1 = rotate_index_map_pooling(Xk[...,0], angle, self._pooling_settings.get('rotation_spreading_radius', 0),
                                               num_orientations, 
                                               num_parts,
                                               self._pooling_settings['shape'])
                else:
                    from pnet.cyfuncs import index_map_pooling_multi as poolf
                    print(Xk.shape)
                    yy1 = poolf(Xk,num_parts,self._pooling_settings.get('shape'), self._pooling_settings.get('strides')) 
                print(yy1.shape, num_orientations, num_true_parts)
                yy = yy1.reshape(yy1.shape[:3] + (num_orientations, num_true_parts))
                blocks.append(yy)#.reshape(yy.shape[:-2] + (-1,)))

            blocks = np.asarray(blocks).transpose((1, 0, 2, 3, 4, 5))
            print('D')

            if 0:
                from pnet.vzlog import default as vz

                import gv

                for i in xrange(self._n_orientations):
                    gv.img.save_image(vz.generate_filename(), blocks[0,i,:,:,0].sum(-1))

                vz.finalize()

            shape = blocks.shape[2:4] + (np.prod(blocks.shape[4:]),)

            # Flatten
            blocks = blocks.reshape(blocks.shape[:2] + (-1,))

            n_init = self._settings.get('n_init', 1)
            n_iter = self._settings.get('n_iter', 10)
            seed = self._settings.get('em_seed', 0)

            ORI = self._n_orientations
            POL = 1

            P = ORI * POL


            def cycles(X):
                return np.asarray([np.concatenate([X[i:], X[:i]]) for i in xrange(len(X))])

            RR = np.arange(ORI)
            PP = np.arange(POL)
            II = [list(itr.product(PPi, RRi)) for PPi in cycles(PP) for RRi in cycles(RR)]
            lookup = dict(zip(itr.product(PP, RR), itr.count()))
            permutations = np.asarray([[lookup[ii] for ii in rows] for rows in II])

            print('E')

            if 0:
                mm = PermutationMM(n_components=self._n_components, 
                                   permutations=permutations,
                                   n_iter=n_iter, 
                                   n_init=n_init, 
                                   random_state=seed, 
                                   min_probability=self._min_prob)
                mm.fit(blocks)
                mu = mm.means_.reshape((self._n_components,)+shape)

            else:       
                num_angle = self._n_orientations
                d = np.prod(shape)
                permutation = np.empty((num_angle, num_angle * d), dtype=np.int_)
                for a in range(num_angle):
                    if a == 0:
                        permutation[a] = np.arange(num_angle * d)
                    else:
                        permutation[a] = np.roll(permutation[a-1], -d)

                from pnet.bernoulli import em      


                XX = blocks.reshape((blocks.shape[0], -1))
                print('F')
                ret = em(XX, self._n_components, n_iter,
                         permutation=permutation, numpy_rng=seed,
                         verbose=True)
                print('G')

                self._extra['training_comp'].append(ret[3])

                mu = ret[1].reshape((self._n_components * self._n_orientations,) + shape)


            
            mm_models.append(mu)
            print('H')


        self._models = np.asarray(mm_models)
    for i in range(trainingDataNum):
        for j in extractedFeature[i]:
            if j!=-1:
                k[j]+=1
    numSecondLayerParts = 10 

    print(k) 
    secondLayerPermutation = np.empty((num_rot, num_rot * num_rot * numParts), dtype = np.int_)
    for a in range(num_rot):
        if a == 0:
            secondLayerPermutation[a] = np.arange(num_rot * num_rot * numParts)
        else:
            secondLayerPermutation[a] = np.roll(secondLayerPermutation[a - 1], num_rot * num_rot * numParts)

    from pnet.bernoulli import em
    superParts = [em(np.array(partsRegion[i]).reshape(len(partsRegion[i]),-1),numSecondLayerParts,permutation=secondLayerPermutation,verbose=True) for i in range(numParts)]     
    allVisParts = []
    for i in range(numParts):
        print(superParts[i][3].shape)
        comps = np.array(superParts[i][3])
        raw_originals = np.array(originalPartsList[i])
        print(raw_originals.shape, comps.shape)
        visParts = np.asarray([raw_originals[comps[:,0]==k,(comps[comps[:,0]==k][:,1]-1)%num_rot].mean(0) for k in range(numParts)])
        allVisParts.append(visParts)

    gr.images(np.array(originalPartsList[0])[:20,0],show=False,zero_to_one=False, vmin=0,vmax=1,fileName = 'test.png')
    print(superParts[0][3][:20,:]) 


    print(shiftRotationLayer._visparts.shape)
    """