Exemplo n.º 1
0
    def fit(self, x_s, y_s, x_t, verbose=False, y_t=[], init_weights=None):
        """
        train classifier
        """
        start = datetime.datetime.now().replace(microsecond=0)
        self.create()
        #        np.random.seed(0)
        #         print("========================================")
        dense1_layer_model = Model(input=self.nn.input[0],
                                   output=self.nn.get_layer(
                                       self.nn.layers[3].name).output)
        dense1_layer_model1 = Model(input=self.nn.input[1],
                                    output=self.nn.get_layer(
                                        self.nn.layers[4].name).output)
        a, b = dense1_layer_model.predict(x_s), dense1_layer_model1.predict(
            x_t)
        tau_to_npy(a, 'xs')
        tau_to_npy(b, 'xt')
        # print("========================================第一次聚类完成")
        if init_weights:
            self.load(init_weights)
        best_acc = 0
        best_loss = 0
        counter = 0
        dummy_y_t = np.zeros((x_t.shape[0], y_s.shape[1]))

        iter_batches = Batches(x_s, y_s, x_t.shape[0])

        for i in range(self.max_n_epoch):
            x_s_batch, y_s_batch = iter_batches.next_batch()
            # print(self.nn.metrics_names)
            metrics = self.nn.train_on_batch([x_s_batch, x_t],
                                             [y_s_batch, dummy_y_t])
            if metrics[3] > best_acc:
                self.save(self.save_weights)
                best_acc = metrics[3]
                best_loss = metrics[1]
                counter = 0
            elif metrics[3] == best_acc and metrics[1] < best_loss:
                self.save(self.save_weights)
                best_loss = metrics[1]
                best_acc = metrics[3]
                counter += 1
            else:
                counter += 1
            if i % 20 == 0 and verbose:
                accs = self.nn.evaluate([x_t, x_t], [y_t, y_t], verbose=0)
                print(
                    'Batch update %.4d loss= %.4f tr-acc= %.4f tst-acc= %.4f' %
                    (i, metrics[1], best_acc, accs[4]))
            if counter > 1000:
                break
        self.load(self.save_weights)
        stop = datetime.datetime.now().replace(microsecond=0)
        print('done in ' + str(stop - start))
    def fit(self, x_s, y_s, x_t, verbose=False, x_val=[], y_val=[]):
        """
        train classifier
        """
        start = datetime.datetime.now().replace(microsecond=0)
        # init
        self.create()
        best_acc = 0
        best_loss = 0
        counter = 0
        dummy_y_t = np.zeros((x_t.shape[0], y_s.shape[1]))
        # batch size is 2000 (arbitrary) when working with augmented data
        # batch size is
        # Note that such high numbers are not possible in fine-tuning with
        # the learning rates of lower layers >0. If we set the lower learning
        # rates to zero, this is equivalent to pre-computing image
        # representations, as we are doing.
        dense1_layer_model = Model(input=self.nn.input[0],
                                   output=self.nn.get_layer(
                                       self.nn.layers[3].name).output)
        dense1_layer_model1 = Model(input=self.nn.input[1],
                                    output=self.nn.get_layer(
                                        self.nn.layers[4].name).output)
        a, b = dense1_layer_model.predict(x_s), dense1_layer_model1.predict(
            x_t)
        tau_to_npy(a, 'xs')
        tau_to_npy(b, 'xt')
        iter_batches = None
        if x_t.shape[0] > 3000:
            # data augmentation is used : equal batches are computed
            batch_s = Batches(x_s, y_s, 2000)
            batch_t = Batches(x_t, dummy_y_t, 2000)
        elif x_t.shape[0] >= x_s.shape[0]:
            # target batch is larger than source batch
            # source batch will be up-sampled via class-balanced copies
            iter_batches = Batches(x_s, y_s, x_t.shape[0])
        else:
            # target batch is smaller than source batch
            # target batch will be randomly up-sampled
            iter_batches = Batches(x_t, dummy_y_t, x_s.shape[0])

        for i in range(self.max_n_epoch):
            if x_t.shape[0] > 3000:
                # equal batches are generated
                x_s_batch, y_s_batch = batch_s.next_batch()
                x_t_batch, y_t_batch = batch_t.next_batch()
            elif x_t.shape[0] >= x_s.shape[0]:
                # source batch is up-sampled via class-balanced copies
                x_s_batch, y_s_batch = iter_batches.next_batch()
                x_t_batch, y_t_batch = x_t, dummy_y_t
            else:
                # target batch is randomly up-sampled
                x_s_batch, y_s_batch = x_s, y_s
                x_t_batch, y_t_batch = iter_batches.next_batch()
            # one full-batch update
            metrics = self.nn.train_on_batch([x_s_batch, x_t_batch],
                                             [y_s_batch, y_t_batch])
            if metrics[3] > best_acc:
                # an improvement happened
                self.save(self.save_weights)
                best_acc = metrics[3]
                best_loss = metrics[1]
                counter = 0
            elif metrics[3] == best_acc and metrics[1] < best_loss:
                # save model with best accuracy and best loss
                self.save(self.save_weights)
                best_loss = metrics[1]
                best_acc = metrics[3]
                counter += 1
            else:
                counter += 1
            # Try the verbose command and you will get a fealing for the target
            # error during training. Maybe manually decreasing CMD weighting
            # can help the optimization, as used by various other works.
            if i % 20 == 0 and verbose:
                accs = self.nn.evaluate([x_val, x_val], [y_val, y_val],
                                        verbose=0)
                print(
                    'Batch update %.4d loss= %.4f tr-acc= %.4f tst-acc= %.4f' %
                    (i, metrics[1], best_acc, accs[4]))
            if counter > 1000:
                # early stopping after 1000 epochs
                # without accuracy increase
                break
        # load best model
        self.load(self.save_weights)
        stop = datetime.datetime.now().replace(microsecond=0)
        print('done in ' + str(stop - start))