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=',')
Пример #2
0
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])