Skip to main content

神经网络的视觉解释

项目描述

维恩

VINN 是神经网络的视觉解释

VINN 包括一系列可解释性算法,如 LIME、Grad CAM、Integrated Gradient、显着图等。

VINN是一个毕业项目,如果可能会更新到新版本。

目标听众

想要了解他们的深度模型学到了什么的开发人员或想要测试他们的新算法的研究人员是 VINN 的潜在受众。

VINN 对算法框架进行了标准化,让您可以按照框架构建自己的算法并进行测试。

安装

要求

您可以通过以下方式创建一个新环境

 conda create -f requirements

或确保您自己的环境有

  • 蟒蛇> = 3.6

  • 火炬> = 1.2

安装最新版本

点:

pip install vinn

康达:

conda install vinn

或者您可以从 GitHub 下载并安装在存储库中

https://github.com/Torato-Taraka/VINN.git
pip install vinn-1.0-py3-none-any.whl

开始

import torch
import torchvision.transforms as tfs
from torchvision.models import resnet18
import cv2

model = resnet18(pretrained=True)
transform = tfs.Compose([
    tfs.ToTensor(),
    tfs.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
last_conv = model.layer4[-1]

image_path = 'test.jpg'
image = cv2.imread(image_path)
image = cv2.resize(image, (256, 256))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    
gpu = True

到目前为止,必要的参数(模型、图像、变换、gpu)已经准备好,您可以使用 VINN 来解释您的模型

import vinn
gradcam = vinn.GradCAM(model=model,
                      image=image,
                      last_conv=last_conv,
                      transform=transform,
                      gpu=gpu)
gradcam.forward()

forward 后,算法完成处理,结果存入gradcam.mask.

您可以将结果可视化,如下所示:

params = {
    "original image", gradcam.image,
    "GradCAM", gradcam.mask,
    "masked image", gradcam.masked_image
}
vinn.subplot([params])

请注意,您应该传递一个字典列表,因为您可能需要同时解释多个图像。

你可以通过调用来查看图像是如何被屏蔽的gradcam.masked_image

但请注意,并非所有算法都同时生成掩码和原始图像,只有 GradCAM、GuidedGradCAM、LIME 和 Sensitivity 具有 masked_image。

当然你可以自己生成,也许以后的版本会实现这个功能。

自定义模型、数据集和算法

VINN 支持自定义您的模型、数据集甚至算法

楷模

你应该像这样组织你的模型

from vinn.model import Models

@Models("yourmodel")
def yourmodel():
    class yourmodel(nn.Module):
        def __init__(self):
        	...
    return yourmodel()

这是为了注册您的算法以便管理

数据集

类似于自定义模型

from vinn.datasets import DataSet

@DataSet("yourdataset")
def yourdataset():
    class yourdataset:
        def __init__(self):
            ...
            
        def __getitem__(self, index):
            image = self.transform(self.images[index])
            lable = self.lables[index]
            return image, lable
        
        def __len__(self):
            return len(self.labels)
    return yourdataset()

__getitem__()并且__len__()是必要的,您可以在 [torch.utils.data.Dataset] 中查看详细信息(torch.utils.data — PyTorch 1.10 文档

您可以通过以下方式查看所有现有数据集

from vinn import list_dataset
list_dataset()

火车模型

from vinn import trainer
from torchvision import transforms as tfs
transform = tfs.Compose([
    ...
])
trainer(
    model_name='yourmodel',
    dataset_name='yourdataset',
    classes=...,
    transform=transform,
    train_size=...,
    test_size=...,
    lr=...,
    epochs=...,
    gpu=True
)
  • model_name: 你定义的@Models() 中的字符串
  • dataset_name: 你定义的@Dataset() 中的字符串
  • classes: 你的数据集的类
  • transform: 你定义它
  • train_size:火车数据中样本的大小
  • test_size:来自您的测试数据的样本大小
  • lr: 学习率
  • epochs: 训练时间
  • gpu: 是否使用 cuda

算法

您应该首先组织您的算法,例如

from vinn.algorithm import Algorithm 
class youralgo(Algorithm):
    def __init__(self, model, image, transform, gpu, ...):
        super().__init__(model, image, transform, gpu)
        ...
        
    def forward(self):
        ...
        self.mask = mask

Algorithm是所有算法的父类

最重要的是您必须将结果传递给self.mask,以便您可以轻松地可视化您的结果。

或者您可以返回结果,但我认为这对您的后续操作不利。

算法参考

执照

VINN 已获得 MIT 许可,可在 LICENSE 文件中找到。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

vinn-1.1.tar.gz (17.2 kB 查看哈希)

已上传 source

内置分布

vinn-1.1-py3-none-any.whl (43.8 kB 查看哈希

已上传 py3