前言
前一篇文章介绍了使用Matlab实现深度学习模型训练以及一些基础的概念,但是我们不难发现,深度学习是一个端到端的过程,而中间过程是一个“黑盒子”,有时候我们需要知道模型是如何得出最终预测结果及基于何种考虑,特别是在医疗领域,可解释性更显得尤为重要。本文将介绍利用Matlab深度学习工具箱中相关函数实现模型训练过程可视化。
一、介绍
Matlab中可解释性方法有Grad-CAM, occlusion sensitivity, LIME,和 deep dream这几种,如下示意图以动物识别为例。
二、实现方法
为了便于直观对比原图像与可解释性图像有必要介绍一个Matlab函数
imagesc:Display image with scaled colors
其中一个语法是imagesc(___,Name,Value),如果要实现更改透明度可以设置“Name”为“AlphaData”,“Value”值可取0-1。再使用hold on和hold off可以实现在原图像上覆盖透明度图像。为了方便集成,我写了一个函数,实现一个输入原始图像返回原始图像和三个输出图像。
代码如下:
function plotMaps(img,map1,map2,map3,title1,title2,title3,alpha,cmap)
figure
subplot(1,4,1)
imshow(img)
subplot(1,4,2)
imshow(img)
hold on
imagesc(map1,'AlphaData',alpha)
colormap(cmap)
title(title1)
hold off
subplot(1,4,3)
imshow(img)
hold on
imagesc(map2,'AlphaData',alpha)
colormap(cmap)
title(title2)
hold off
subplot(1,4,4)
imshow(img)
hold on
imagesc(map3,'AlphaData',alpha)
colormap(cmap)
title(title3)
hold off
end
然后就可以配置可解释方法的几个函数(以gradCAM和LIME为例)其中LIME做了良性和恶性的对比
,也就是比较在同一个影像图片中模型基于不同的分类的关注点。
%gardCAM
scoreMap = gradCAM(trainedNetwork_2,I,label);
%LIME
limeMapClass1 = imageLIME(trainedNetwork_2,I,"benign");
limeMapClass2 = imageLIME(trainedNetwork_2,I,"malignant");
plotMaps(I,scoreMap,limeMapClass1,limeMapClass2,"gardCAM","LIME(benign)","LIME(malignant)",0.5,"jet")
完整代码如下:
%% TestCode识别图像类型
clc;clear
% 加载训练好的模型
load('trainedNetwork_2');
% 调整图像大小
[file,path] = uigetfile('*');
image = fullfile(path,file);
I = imresize(imread(image),[227,227]);
file
% 使用模型分类
label = classify(trainedNetwork_2, I)
%gardCAM
scoreMap = gradCAM(trainedNetwork_2,I,label);
%LIME
limeMapClass1 = imageLIME(trainedNetwork_2,I,"benign");
limeMapClass2 = imageLIME(trainedNetwork_2,I,"malignant");
plotMaps(I,scoreMap,limeMapClass1,limeMapClass2,"gardCAM","LIME(benign)","LIME(malignant)",0.5,"jet")
我们可以看到输出结果如下:
从图片中可以看出,对于gardCAM和LIME红色的区域都是模型训练过程中感兴趣区域,基本都处在结节处,其余颜色包裹在边界周围,而传统的医生阅片也是观察结节的边界形状规则度、清晰度和内核回声度,实现了模型的可解释性.