def draw_weights_of_net(net, img_name_pre="", blank_size=2, img_save_dir="Saved_Virtualizations"): """ 绘制网络所有的特征层的内核参数情况 :param net: 网络 :param img_name_pre: 存储的图片的前缀 :param blank_size: 样图之间的间距(pixel) :param img_save_dir: 存储的目录 :return: None """ layer_number = 0 stat_dict = net.state_dict() for dic in stat_dict.keys(): dic_splited = dic.split(".") if dic_splited[0] == 'features' and dic_splited[2] == 'weight': img_save_name = img_name_pre + "_weight_layer_" + str(layer_number) weights = stat_dict[dic] # print(dic, weights) out_channel_num = len(weights) in_channel_num = len(weights[0]) kernel_height = len(weights[0][0]) kernel_width = len(weights[0][0][0]) img_arr = np.array([[ 0.5 for _ in range(kernel_width * in_channel_num + (in_channel_num - 1) * blank_size) ] for _ in range(kernel_height * out_channel_num + (out_channel_num - 1) * blank_size)]) # print(img_arr.shape) for out_channel_number in range(out_channel_num): for in_channel_number in range(in_channel_num): start_row_index, start_col_index = (out_channel_number) * ( blank_size + kernel_height), (in_channel_number) * ( blank_size + kernel_width) kernel = weights[out_channel_number][in_channel_number] # print(kernel.shape) for row_pixel_index in range(kernel.shape[0]): for col_pixel_index in range(kernel.shape[1]): img_arr[start_row_index + row_pixel_index][ start_col_index + col_pixel_index] = kernel[ row_pixel_index][col_pixel_index] img = Image.fromarray(img_arr) if not os.path.exists(img_save_dir): os.mkdir(img_save_dir) utils.draw_img(img, os.path.join(img_save_dir, img_save_name), plt_show=False) layer_number += 1
def build_and_draw_img_of_features(images, feature_index, type="", img_name_pre="", img_save_dir="Saved_Virtualizations"): """ 构建并绘制特征层的图像 :param images: 钩子函数获取的特征层,[tuple, tuple, ..., tuple] :param feature_index: 特征序号 :param type: 特征类型('in'表示特征层的输入,'out'表示特征层的输出,'end'表示网络最终特征输出) :param img_name_pre: 存储的特征层 img 名称前缀 :param img_save_dir: 存储的特征层 img 路径 :return: 保存的img路径 """ # print(images.shape) img_save_name = img_name_pre + "_feature_layer_" + str( feature_index) + "_" + type for i in range(len(images)): # print("-----------img %s------------" % str(i)) image = images[i] start_build_time = time.time() img = build_img_of_features(image) end_build_time = time.time() build_duration = round((end_build_time - start_build_time) * 1000, 2) print("build_duration:", build_duration) if not os.path.exists(img_save_dir): os.mkdir(img_save_dir) img_save_path = os.path.join(img_save_dir, img_save_name + "_of_img_" + str(i)) start_draw_time = time.time() utils.draw_img(img, img_save_path, plt_show=False) end_draw_time = time.time() draw_duration = round((end_draw_time - start_draw_time) * 1000, 2) print("draw_duration:", draw_duration) break return img_save_path
读取label分类信息 :return: 无 ''' with open(self.cla_data_file_path) as file: lines = file.readlines() # 将分类信息处理成map for line in lines: file_name, classification = line.strip().split(" ") file_name = file_name.split(".")[0] # print(file_name, classification) self.cla_map[file_name] = int(classification) - 1 self.cla_num_list[int(classification) - 1] += 1 print("分类信息读取完毕!") print("数据集已分类的图片个数:", len(self.cla_map)) print("已分类各类图片个数:", self.cla_num_list) if __name__ == "__main__": f1 = RAF_no_fl(is_train=True, img_dir_pre_path="../data/RAF_no_fl", RAF_img_dir_pre_path="../data/RAF") f2 = RAF_no_fl(is_train=False, img_dir_pre_path="../data/RAF_no_fl", RAF_img_dir_pre_path="../data/RAF") print(f1.__len__(), f2.__len__()) from utils.utils import draw_img draw_img(f1.__getitem__(0)[0]) draw_img(f2.__getitem__(0)[0])
img, cla = self.test_data[index], self.test_classes[index] # 由于存在 random_crop 等的随机处理,应该是读取的时候进行,这样每个epoch都能够获取不同的random处理 if self.transform is not None: img = self.transform(img) return img, cla def __len__(self): """ Returns: int: data num. """ if self.is_train: return self.train_data_num else: return self.test_data_num def set_transform(self, transform): self.transform = transform if __name__ == "__main__": c1 = CKPlus(is_train=True, img_dir_pre_path="../data/CK+") c2 = CKPlus(is_train=False, img_dir_pre_path="../data/CK+") print(c1.__len__(), c2.__len__()) from utils.utils import draw_img draw_img(c1.__getitem__(0)[0]) draw_img(c2.__getitem__(0)[0])
# 由于存在 random_crop 等的随机处理,应该是读取的时候进行,这样每个epoch都能够获取不同的random处理 if self.transform is not None: img = self.transform(img) return img, cla def __len__(self): """ Returns: int: data num. """ if self.is_train: return self.train_data_num else: return self.test_data_num def set_transform(self, transform): self.transform = transform if __name__ == "__main__": j1 = JAFFE(is_train=True, img_dir_pre_path="../data/jaffe") j2 = JAFFE(is_train=False, img_dir_pre_path="../data/jaffe") print(j1.__len__(), j2.__len__()) from utils.utils import draw_img draw_img(j1.__getitem__(0)[0]) draw_img(j2.__getitem__(0)[0])