网络特征之PCA可视化-Python实现

前言

PCA也是对网络特征可视化的一种方法,目的是对特征进行降维,然后通过图片的形式来对网络的特征提供一种解释。
所以,本博客提供一个将网络特征进行PCA的可视化的代码,其原理为将C通道的特征降维到3通道,即图片的RGB通道,然后直接进行可视化。

关于PCA和t-SNE的差异,可以参考我的博客:t-SNE可视化-Python实现

源码

import os
import numpy as np
from sklearn.decomposition import PCA

def embedding_pca(embeddings, n_components=3, as_rgb=True):
    '''
    输入:
    embeddings: 网络的特征,维度为[C, H, W]
    n_components: 将网络的特征降维成多少个通道,默认为3,即图片的RGB三个通道
    as_rgb: 是否转换为图片格式,默认为是

    输出:
    embed_flat: 一个通道数量为3的图片矩阵,维度为[H, W, 3]
    函数返回的结果,可以通过cv2等工具直接保存为图片
    例如: cv2.imwrite('pca.png', embed_flat)
    '''

    pca = PCA(n_components=n_components)
    embed_dim = embeddings.shape[0]
    shape = embeddings.shape[1:]

    embed_flat = embeddings.reshape(embed_dim, -1).T
    embed_flat = pca.fit_transform(embed_flat).T
    embed_flat = embed_flat.reshape((n_components,) + shape)

    if as_rgb:
        embed_flat = 255 * (embed_flat - embed_flat.min()) / np.ptp(embed_flat)
        embed_flat = np.transpose(embed_flat, (1,2,0))
        embed_flat = embed_flat.astype('uint8')
    return embed_flat

可视化结果示例

在这里插入图片描述
PCA可视化的结果是取的网络最后一层输出的特征(其它层的特征完全也可以),从PCA可视化中可以从特征层面可以解释网络完成了对相邻实例的区分。更多的细节可参考AAAI 2022文章:Learning to Model Pixel-Embedded Affinity for Homogeneous Instance Segmentation。

猜你喜欢

转载自blog.csdn.net/qq_33757398/article/details/129983346
今日推荐