def get_activations(layer_num, base_model, mode='summation', folder='ILSVRC2012_img_val'): """ Returns a matrix s.t. activations[i][j] is the summed/maxed activation of image[i] at filter[j] for a given layer This matrix of activations is saved as a .csv file and will later be used by 'find_strongest_images' :param layer_num: Specifies layer, whose filters' activations are returned :param base_model: Pass alexnet_model :param mode: either 'summation' or 'maximum' :param folder: Specify folder that contains validation images """ assert mode in ('summation', 'maximum'), "Mode has to be either 'summation' or 'maximum'" print('Working on layer {}\n'.format(layer_num)) filters = AlexNet.channels[layer_num] activation_matrix_filename = 'Data/Strongest_Activation_Layer{}.csv'.format(layer_num) # Init array to save activations, Filter and image numbers start with 1!! activations = np.full((AlexNet.val_set_size + 1, filters + 1), fill_value=0.0, dtype=np.float32) # Create Model up to layer_num model = AlexNet(layer_num, base_model) # For timing timesteps = [time.time()] save_interval = 10000 time_interval = 1000 for img_id in range(1, AlexNet.val_set_size + 1): # Convert image_id to file location id_str = str(img_id) while len(id_str) < 5: id_str = '0' + id_str img_name = folder + '/ILSVRC2012_val_000' + id_str + '.JPEG' # Get activations for shortened model activation_img = model.predict(img_name) # Make sure that dimensions 2 and 3 are spacial (Image is square) assert activation_img.shape[2] == activation_img.shape[3], "Index ordering incorrect" if mode == 'summing': # Sum over spacial dimension to get activation for given filter and given image assert activation_img.shape[2] == activation_img.shape[3], "Index ordering incorrect" activation_img = activation_img.sum(3) activation_img = activation_img.sum(2) if mode == 'maximum': # Find maximum activation for each filter for a given image activation_img = np.nanmax(activation_img, axis=3) activation_img = np.nanmax(activation_img, axis=2) # Remove batch size dimension assert activation_img.shape[0] == 1 activation_img = activation_img.sum(0) # Make activations 1-based indexing activation_img = np.insert(activation_img, 0, 0.0) # activation_image is now a vector of length equal to number of filters (plus one for one-based indexing) # each entry corresponds to the maximum/summed activation of each filter for a given image form validation set # Copy activation results for image to matrix activations[img_id] = activation_img[:] # Print progress if img_id % time_interval == 0: timesteps.append(time.time()) last_interval = timesteps[-1] - timesteps[-2] total_execution = timesteps[-1] - timesteps[0] expected_remaining_time = total_execution / img_id * (AlexNet.val_set_size - img_id) print("Current image ID: {}".format(img_id)) print("The last 100 images took {0:.2f} s.".format(100 * last_interval / time_interval)) print("The average time per 100 images so far is {0:.2f} s".format(100 * total_execution / img_id)) print("Total execution time so far: {0:.2f} min".format(total_execution / 60)) print("The extrapolated remaining time is {0:.2f} min".format(expected_remaining_time / 60)) print('\n') # Update output file if img_id % save_interval == 0: print("Results for first {} images saved\n".format(img_id)) try: os.remove(activation_matrix_filename) except OSError: pass np.savetxt(activation_matrix_filename, activations, delimiter=',') np.savetxt(activation_matrix_filename, activations, delimiter=',')
def get_activations(layer_num, base_model, mode='summation', folder='/home/z840/ALISURE/Data/VOC2012/ILSVRC2012_img_val'): """ 返回矩阵 activations[i][j] 是 summed/maxed 过得 image[i] at filter[j] 矩阵保存到 .csv 文件, 之后'find_strongest_images'会使用 :param layer_num: Specifies layer, whose filters' activations are returned :param base_model: Pass alexnet_model :param mode: either 'summation' or 'maximum' :param folder: Specify folder that contains validation images """ assert mode in ('summation', 'maximum'), "Mode has to be either 'summation' or 'maximum'" print('Working on layer {}\n'.format(layer_num)) filters = AlexNet.channels[layer_num] activation_matrix_filename = 'data/Strongest_Activation_Layer{}.csv'.format(layer_num) # 初始化激活矩阵, Filter and image numbers start with 1!! activations = np.full((AlexNet.val_set_size + 1, filters + 1), fill_value=0.0, dtype=np.float32) # Create Model up to layer_num model = AlexNet(layer_num, base_model) # For timing timesteps = [time.time()] save_interval = 10000 time_interval = 1000 for img_id in range(1, AlexNet.val_set_size + 1): # Convert image_id to file location id_str = str(img_id) while len(id_str) < 5: id_str = '0' + id_str img_name = folder + '/ILSVRC2012_val_000' + id_str + '.JPEG' # 获得对应层的特征图 activation_img = model.predict(img_name) # Make sure that dimensions 2 and 3 are spacial (Image is square) assert activation_img.shape[2] == activation_img.shape[3], "Index ordering incorrect" # 降维 if mode == 'summation': assert activation_img.shape[2] == activation_img.shape[3], "Index ordering incorrect" activation_img = activation_img.sum(3) activation_img = activation_img.sum(2) if mode == 'maximum': activation_img = np.nanmax(activation_img, axis=3) activation_img = np.nanmax(activation_img, axis=2) # Remove batch size dimension assert activation_img.shape[0] == 1 activation_img = activation_img.sum(0) # 使得激活图从1开始 activation_img = np.insert(activation_img, 0, 0.0) # activation_image现在存储filter(下标从1开始) # 每个filter通过maximum/summed 处理 # 拷贝激活值到图片 activations[img_id] = activation_img[:] # Print progress if img_id % time_interval == 0: timesteps.append(time.time()) last_interval = timesteps[-1] - timesteps[-2] total_execution = timesteps[-1] - timesteps[0] expected_remaining_time = total_execution / img_id * (AlexNet.val_set_size - img_id) print("Current image ID: {}".format(img_id)) print("The last 100 images took {0:.2f} s.".format(100 * last_interval / time_interval)) print("The average time per 100 images so far is {0:.2f} s".format(100 * total_execution / img_id)) print("Total execution time so far: {0:.2f} min".format(total_execution / 60)) print("The extrapolated remaining time is {0:.2f} min".format(expected_remaining_time / 60)) print('\n') # save if img_id % save_interval == 0: print("Results for first {} images saved\n".format(img_id)) try: os.remove(activation_matrix_filename) except OSError: pass np.savetxt(activation_matrix_filename, activations, delimiter=',') np.savetxt(activation_matrix_filename, activations, delimiter=',')
steps=test_num//Batch_Size) print("Loss = " + str(evals[0])) print("Test Accuracy = " + str(evals[1])) # Predict the classifcation given the implicit steps=7301 for selecting the specific image number. predict_datagen = ImageDataGenerator(rescale=1.0/255) predict_generator = predict_datagen.flow_from_directory(predict_dir, target_size=(image_width,image_height), batch_size=Batch_Size, class_mode='categorical') predict_num = predict_generator.samples # Make the prediction for any one of the predicted images predictions = model.predict(predict_generator, verbose=1, batch_size=Batch_Size, steps=predict_num//Batch_Size) # Plot the discriptive diagram imshow(predict_generator[5800][0][0]) plt.imsave("predicted1.png", predict_generator[5800][0][0]) predictions[5800] print(predictions[5800])