分类卷积网络的可视化【附代码】

写了一个有关对卷积网络可视化的小工具,可以直接调用使用,不需要对网络重新训练!【如果用在目标检测网络或者其他网络中需要稍微进行修改】

直接附代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn


def Cnn_View(cnn_output, classes_layer, Or_img):
    '''
    cnn_output.size(1)是获得上一层的通道数
    如果你用的是CPU推理的,那么在cam处你应该将张量放在cpu上【我这里默认用的cuda】
    因为我的网络输入大小为224*224大小,所以需要对resize成224*224,以保证叠加图像大小一致!!
    最后将热力图和原始图进行一个叠加
    本代码是放在平均池化之后,分类层之前的,即classes_layer是定义的全连接层,如果放在其他层可以把该层注释掉
    '''
    Or_img = cv2.imread(Or_img)
    cam = nn.Conv2d(cnn_output.size(1), 1, 1, 1, 1).cuda()  # 512是上一层卷积输出后的通道,可以根据自己的网络修改
    cnn_output1 = cnn_output

    cnn_output = torch.flatten(cnn_output, 1)  # 平铺  (batch_size,512*7*7)
    cnn_output = classes_layer(cnn_output)  # 分类  (batch_size,512*7*7,num_classes)
    preds = torch.softmax(cnn_output[0], dim=-1).cpu().numpy()

    cam_output = cam(cnn_output1)

    cam_output[0, :, :, 1] = cam_output[0, :, :, 1 if preds.all() > 0.5 else 0]
    
    cam_output /= 10
    cam_output[cam_output < 0] = 0
    cam_output[cam_output > 1] = 1
    cam_output = cam_output.cpu().numpy()
    cam_output = cam_output.squeeze(0)
    img = cam_output.transpose(1, 2, 0)
    img = cv2.resize(img, (224, 224))
    img = np.uint8(255 * img)
    heatmap = cv2.applyColorMap(img, cv2.COLORMAP_JET)
    Or_img = cv2.resize(Or_img, (224, 224))
    out = cv2.addWeighted(Or_img, 0.8, heatmap, 0.4, 0)
    plt.axis('off')
    plt.imshow(out[:, :, ::-1])
    plt.show()

在网络中调用该函数,放在网络的forward(self,x)函数下,如果是分类网络,可以放在平均池化层后面 

例如:

    def forward(self, x):

        x = self.features(x)  # 主干网络  14*14输出通道512
        x = self.avgpool(x)  # 平均池化  7*7输出通道512   (batch_size,512,7,7)
        Cnn_View(x, self.classifier, input("输入要叠加的原始图像: "))

最终得到的热力图和原始图叠加后:


这样可以更进一步理解卷积的可视化,还有就是可以放在论文中,使自己的论文看着更好看点。放在目标检测中应该需要对上面稍微改一下。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用Python和常见的深度学习库(如TensorFlow或PyTorch)进行二维卷积和t-SNE可视化的示例代码: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.manifold import TSNE import tensorflow as tf from tensorflow.keras.datasets import mnist # 加载MNIST数据集 (train_images, _), (_, _) = mnist.load_data() # 数据预处理 train_images = train_images.reshape(train_images.shape[0], 28, 28, 1) train_images = train_images.astype('float32') / 255 # 创建卷积神经网络模型(这里以TensorFlow为例) model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_images, np.zeros(len(train_images)), epochs=1, batch_size=64) # 获取卷积层的输出特征 conv_layer = model.layers[0] conv_output = conv_layer.output # 创建新的模型,输出为卷积层的特征 feature_model = tf.keras.models.Model(inputs=model.input, outputs=conv_output) # 提取卷积特征 conv_features = feature_model.predict(train_images) # 使用t-SNE进行降维 tsne = TSNE(n_components=2) tsne_features = tsne.fit_transform(conv_features.reshape(conv_features.shape[0], -1)) # 可视化 plt.scatter(tsne_features[:, 0], tsne_features[:, 1], c='b', marker='o') plt.title('t-SNE Visualization of Convolutional Features') plt.show() ``` 这段代码使用MNIST数据集作为示例数据,创建了一个简单卷积神经网络模型,并提取了卷积层的输出特征。然后使用t-SNE对提取的特征进行降维,并将降维后的特征用散点图进行可视化展示。 请注意,这只是一个示例代码,实际应用中可能需要根据具体任务和数据集进行适当的调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃肉的鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值