コード例 #1
0
ファイル: ComputeMI.py プロジェクト: zxh009123/DeepInfoFlow
    def EVMethod(self):
        start = time.time()

        progress = 0

        IX_dic = {}
        IY_dic = {}

        # prepare sample indices
        Nrepeats = 10
        random_indexes = self.random_index((Nrepeats, 400))

        print("len dataset : ", len(self._test_set))
        epoch_files = os.listdir(self.path)
        for epoch_file in epoch_files:
            # initial progress record
            progress += 1

            self.progress_bar = int(str(round(float(progress / len(epoch_files)) * 100.0)))
            print("\rprogress : " + str(round(float(progress / len(epoch_files)) * 100.0)) + "%",end = "", flush = True)
            if not epoch_file.endswith('.pth'):
                continue
            # load ckpt
            ckpt = torch.load(os.path.join(self.path, epoch_file))
            epoch = ckpt['epoch']

            #check if this epoch need to be calculated
            if not self.needLog(epoch):
                continue

            # load model epoch weight
            self._model.load_state_dict(ckpt['model_state_dict'])
            # set model to eval
            self._model.eval()

            # container for activations, features and labels
            layer_activity = []
            X = []
            Y = []

            # inference on test set to get layer activations
            for j, (inputs, labels) in enumerate(self._test_set):
                outputs = self._model(inputs)
                Y.append(labels.clone().numpy())
                X.append(inputs.clone().squeeze(0).numpy())

                # for each layer activation add to container
                for i in range(len(outputs)):
                    data = outputs[i]
                    if len(layer_activity) < len(outputs):
                        layer_activity.append(data)
                    else:
                        layer_activity[i] = torch.cat((layer_activity[i], data), dim = 0)

            # for each layer, compute averaged MI
            X = np.array(X)
            Y = np.array(Y)

            IX_epoch = []
            IY_epoch = []
            for layer in layer_activity:
                layer = layer.detach().numpy()

                avg_IX, avg_IY = self._compute_averaged_IX_IY(X, Y, layer, random_indexes)
                
                IX_epoch.append(avg_IX)
                IY_epoch.append(avg_IY)

            if epoch not in IX_dic.keys() and epoch not in IY_dic.keys():
                IX_dic[epoch] = IX_epoch
                IY_dic[epoch] = IY_epoch
            else:
                raise RuntimeError('epoch is duplicated')

        plotter = PlotFigure(self._opt, self.model_name)
        plotter.plot_MI_plane(IX_dic, IY_dic)
        #save plot data
        self._save_plot_data("IX_dic_data.pkl", IX_dic)
        self._save_plot_data("IY_dic_data.pkl", IY_dic)
        end = time.time()
        print(" ")
        print("total time cost : ", end - start)
コード例 #2
0
ファイル: ComputeMI.py プロジェクト: xyli1905/DeepInfoFlow
    def EVMethod(self):
        start = time.time()
        print(f"calculation begins at {time.asctime()}")

        IX_dic = {}
        IY_dic = {}

        # prepare sample indices
        Nrepeats = 1
        random_indexes = self.random_index((Nrepeats, 1000))

        print("len dataset : ", len(self.dataset.dataset))
        ckpt_path = os.path.join(self.model_path, self._opt.ckpt_dir)
        epoch_files = os.listdir(ckpt_path)
        num_epoch_files = len(epoch_files)

        progress = 0
        for epoch_file in epoch_files:
            if not epoch_file.endswith('.pth'):
                continue

            # running progress record
            progress += 1
            progress_ratio = float(progress / num_epoch_files) * 100.0
            # self.progress_bar = int(progress_ratio)
            print(f"\rprogress : {progress_ratio:.4f}%", end="", flush=True)

            # load model epoch weight
            indicators = self._model.load_model(epoch_file, CKECK_LOG=True)
            if not indicators["NEED_LOG"]:
                continue  # if this epoch does not need to be logged continue
            epoch = indicators["epoch"]
            # set model to eval
            self._model.eval()

            # container for activations, features and labels
            layer_activity = []
            X = np.array([])
            Y = np.array([])

            # inference on test set to get layer activations
            for j, (inputs, labels) in enumerate(self.dataset):
                outputs = self._model.predict(inputs)
                np_labels = labels.clone().numpy().reshape(-1, 1)
                np_inputs = inputs.clone().squeeze(0).numpy()
                X = np.vstack((X, np_inputs)) if len(X) != 0 else np_inputs
                Y = np.vstack((Y, np_labels)) if len(Y) != 0 else np_labels

                # for each layer activation add to container
                for i in range(len(outputs)):
                    data = outputs[i]
                    if len(layer_activity) < len(outputs):
                        layer_activity.append(data)
                    else:
                        layer_activity[i] = torch.cat(
                            (layer_activity[i], data), dim=0)

            IX_epoch = []
            IY_epoch = []
            for layer in layer_activity:
                layer = layer.detach().numpy()

                avg_IX, avg_IY = self._compute_averaged_IX_IY(
                    X, Y, layer, random_indexes)

                IX_epoch.append(avg_IX)
                IY_epoch.append(avg_IY)

            if epoch not in IX_dic.keys() and epoch not in IY_dic.keys():
                IX_dic[epoch] = IX_epoch
                IY_dic[epoch] = IY_epoch
            else:
                raise RuntimeError('epoch is duplicated')

        # save data, then plot
        plotter = PlotFigure(self._opt, self.model_name)
        plotter.save_plot_data("IX_dic_data.pkl", IX_dic)
        plotter.save_plot_data("IY_dic_data.pkl", IY_dic)
        plotter.plot_MI_plane(IX_dic, IY_dic)
        end = time.time()
        print(" ")
        print("total time cost : ", end - start)
コード例 #3
0
ファイル: ComputeMI.py プロジェクト: zxh009123/DeepInfoFlow
    def kdeMethod(self):
        saved_labelixs, label_probs = self.get_saved_labelixs_and_labelprobs()

        epoch_files = os.listdir(self.path)
        start = time.time()

        IX = {}
        IY = {}

        nats2bits = 1.0/np.log(2)

        progress = 0
        for epoch_file in epoch_files:
            progress += 1
            self.progress_bar = int(str(round(float(progress / len(epoch_files)) * 100.0)))
            print("\rprogress : " + str(round(float(progress / len(epoch_files)) * 100.0)) + "%",end = "", flush = True)
            if not epoch_file.endswith('.pth'):
                continue
            
            # load ckpt
            ckpt = torch.load(os.path.join(self.path, epoch_file))
            epoch = ckpt['epoch']

            #check if this epoch need to be calculated
            if not self.needLog(epoch):
                continue

            # load model epoch weight
            self._model.load_state_dict(ckpt['model_state_dict'])
            # set model to eval
            self._model.eval()

            # container for activations, features and labels
            layer_activity = []
            X = []
            Y = []

            # inference on test set to get layer activations
            for j, (inputs, labels) in enumerate(self._test_set):
                outputs = self._model(inputs)
                Y.append(labels)
                X.append(inputs)

                # for each layer activation add to container
                for i in range(len(outputs)):
                    data = outputs[i]
                    if len(layer_activity) < len(outputs):
                        layer_activity.append(data)
                    else:
                        layer_activity[i] = torch.cat((layer_activity[i], data), dim = 0)
            # for each layer compute IX and IY
            IX_epoch = []
            IY_epoch = []
            for layer in layer_activity:
                upper = self.measure.entropy_estimator_kl(layer, 0.001)
                hM_given_X = self.measure.kde_condentropy(layer, 0.001)

                mutual_info_X = upper - hM_given_X # IX
                IX_epoch.append(mutual_info_X.item() * nats2bits)

                # for each label y
                hM_given_Y_upper=0.
                for i, key in enumerate(sorted(saved_labelixs.keys())):
                    hcond_upper = self.measure.entropy_estimator_kl(layer[saved_labelixs[key]], 0.001)
                    hM_given_Y_upper += label_probs[i] * hcond_upper 

                mutual_info_Y = upper - hM_given_Y_upper
                IY_epoch.append(mutual_info_Y.item() * nats2bits)

            if epoch not in IX.keys() and epoch not in IY.keys():
                IX[epoch] = IX_epoch
                IY[epoch] = IY_epoch
            else:
                raise RuntimeError('epoch is duplicated')

        plotter = PlotFigure(self._opt, self.model_name)
        plotter.plot_MI_plane(IX, IY)
        #save plot data
        self._save_plot_data("IX_dic_data.pkl", IX)
        self._save_plot_data("IY_dic_data.pkl", IY)
        end = time.time()
        print(" ")
        print("total time cost : ", end - start)
コード例 #4
0
ファイル: ComputeMI.py プロジェクト: xyli1905/DeepInfoFlow
    def kdeMethod(self):
        start = time.time()

        saved_labelixs, label_probs = self.get_saved_labelixs_and_labelprobs()

        ckpt_path = os.path.join(self.model_path, self._opt.ckpt_dir)
        epoch_files = os.listdir(ckpt_path)
        num_epoch_files = len(epoch_files)

        IX = {}
        IY = {}

        nats2bits = 1.0 / np.log(2)

        progress = 0
        for epoch_file in epoch_files:
            if not epoch_file.endswith('.pth'):
                continue

            progress += 1
            progress_ratio = float(progress / num_epoch_files) * 100.0
            # self.progress_bar = int(progress_ratio)
            print(f"\rprogress : {progress_ratio:.4f}%", end="", flush=True)

            # load model epoch weight
            indicators = self._model.load_model(epoch_file, CKECK_LOG=True)
            if not indicators["NEED_LOG"]:
                continue  # if this epoch does not need to be logged continue
            epoch = indicators["epoch"]
            # set model to eval
            self._model.eval()

            # container for activations, features and labels
            layer_activity = []
            X = []
            Y = []

            # inference on test set to get layer activations
            for j, (inputs, labels) in enumerate(self.dataset):
                outputs = self._model.predict(inputs)
                Y.append(labels)
                X.append(inputs)

                # for each layer activation add to container
                for i in range(len(outputs)):
                    data = outputs[i]
                    if len(layer_activity) < len(outputs):
                        layer_activity.append(data)
                    else:
                        layer_activity[i] = torch.cat(
                            (layer_activity[i], data), dim=0)
            # for each layer compute IX and IY
            IX_epoch = []
            IY_epoch = []
            for layer in layer_activity:
                upper = measure.entropy_estimator_kl(layer, 0.001)
                hM_given_X = measure.kde_condentropy(layer, 0.001)

                mutual_info_X = upper - hM_given_X  # IX
                IX_epoch.append(mutual_info_X.item() * nats2bits)

                # for each label y
                hM_given_Y_upper = 0.
                for i, key in enumerate(sorted(saved_labelixs.keys())):
                    hcond_upper = measure.entropy_estimator_kl(
                        layer[saved_labelixs[key]], 0.001)
                    hM_given_Y_upper += label_probs[i] * hcond_upper

                mutual_info_Y = upper - hM_given_Y_upper
                IY_epoch.append(mutual_info_Y.item() * nats2bits)

            if epoch not in IX.keys() and epoch not in IY.keys():
                IX[epoch] = IX_epoch
                IY[epoch] = IY_epoch
            else:
                raise RuntimeError('epoch is duplicated')

        # save data, then plot
        plotter = PlotFigure(self._opt, self.model_name)
        plotter.save_plot_data("IX_dic_data.pkl", IX)
        plotter.save_plot_data("IY_dic_data.pkl", IY)
        plotter.plot_MI_plane(IX, IY)
        end = time.time()
        print(" ")
        print("total time cost : ", end - start)