拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Google Research Activation Clustering:基于无监督聚类的深度神经网络可解释性实战指南

Google Research Activation Clustering基于无监督聚类的深度神经网络可解释性实战指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research导读本文围绕 google-research 仓库中的activation_clustering项目讲解如何利用激活聚类Activation Clustering技术对已训练好的深度分类模型进行解释通过无监督聚类模型学习网络中间层激活的潜在结构进而得到可替代原模型的白盒代理模型surrogate model并据此检索与测试样本相似的训练样本、提炼网络内部概念concept。读完本文你将掌握该模型的完整安装启动流程、训练与可视化配置方法以及其核心实现原理。项目定位与核心思想activation_clustering是论文 Explaining Deep Neural Networks using Unsupervised ClusteringarXiv:2007.07477的官方实现。其核心思想可概括为深度网络分类模型可以视为特征提取器 线性分类头的组合其中间层激活activation编码了从低级视觉特征到高级语义特征的多层次信息对每个指定层的激活分别执行无监督聚类本项目使用 Deep Embedding Clustering即 DEC使激活空间被划分为若干簇每个簇可视为该层网络学习到的概念聚类结果再与类别标签建立经验后验概率映射从而构成一个可解释的代理模型。从仓库结构看activation_clustering目录下包含三个主要部分核心实现ac_model.pyACModel 类、utils.py激活提取与可视化工具、__init__.pyCIFAR-10 示例train.ipynb训练代理模型、similar_images_concepts.ipynb相似样本与概念可视化Dockerfile 与 setup.py一键构建含示例模型与数据的环境。安装与运行Docker 一键启动 Jupyter仓库 README 给出了完整的 5 步上手流程全程基于 Docker包含示例模型与数据下载无需手工配置 Python 环境。步骤 1克隆仓库git clone https://github.com/google-research/google-research.git --depth1使用--depth1只拉取最新提交可显著减小克隆体积这是官方 README 推荐的用法。步骤 2构建 Docker 镜像cd google-research/activation_clustering docker build -t activation_clustering .结合 Dockerfile 可以看到该镜像构建时自动完成的关键工作基于python:3.6基础镜像并安装git与 Google Cloud SDK用于gsutil/gcloud storage下载数据克隆仓库后从gs://cloud-samples-data/research/activation_clustering/下载两类数据work_dir预训练好的激活聚类模型工作目录供similar_images_concepts.ipynb直接使用model.h5在 CIFAR-10 上训练好的 ResNet 基线分类模型执行pip install -e .安装本项目及其依赖预下载 CIFAR-10 数据集通过tensorflow_datasets并缓存进镜像。依赖清单在 setup.py 中可查scikit-learn0.19.2、tensorflow-gpu2.1.0、tensorflow-datasets2.1.0、matplotlib2.2.4、scipy1.2.2、PyYaml5.3、jupyter1.0.0以及从 GitHub 指定 commit 安装的dec_daDEC-DA 聚类库提供ConvIDEC卷积聚类模型。注意依赖锁定在较老的 TensorFlow 2.1 与 Python 3.6 时代因此官方以 Docker 作为推荐的运行方式以隔离版本冲突。步骤 3启动容器内 Jupyter 服务docker run -it -p 8888:8888 activation_clustering镜像的ENTRYPOINT为jupyter notebook --ip0.0.0.0 --no-browser --allow-root --notebook-dirgoogle-research/activation_clustering/examples/cifar10即容器启动后直接在examples/cifar10/目录下开启 Jupyter Notebook监听所有网卡并通过-p 8888:8888将 8888 端口映射到宿主机。步骤 4浏览器访问在浏览器中打开docker run输出的地址形如http://127.0.0.1:8888/?token1234abcd...token 由 Jupyter 启动时自动生成并打印在终端中注意完整复制。步骤 5跟随示例 Notebook按 examples/cifar10/ 下的两个 Notebook 依次操作先用train.ipynb从基线模型训练激活聚类模型再用similar_images_concepts.ipynb做相似图像检索与概念可视化具体用法见下文。训练激活聚类模型train.ipynb 详解examples/cifar10/train.ipynb 展示了如何从已训练好的 Keras 基线模型CIFAR-10 ResNet即model.h5出发训练激活聚类模型。数据预处理与激活缓存Notebook 先定义与基线模型训练一致的预处理函数图像归一化到[0,1]随后加载基线模型model tf.keras.models.load_model(model.h5)关键一步是缓存激活对训练集与测试集分别调用cache_activations把指定层的激活写入磁盘便于后续迭代训练而不必反复前向传播batch_size 500 ds input_fn(batch_size, train_ds) new_acm.cache_activations(ds, tagtrain)在源码 ac_model.py 中cache_activations将激活写入{work_dir}/activations/activations_{tag}.npz每个文件以npz格式保存以激活名为 key 的 numpy 数组字典之后用load_activations_dict读取activations_dict new_acm.load_activations_dict( activations_filenamework_dir /activations/activations_train.npz)聚类配置与模型构建聚类配置是一组(激活层名, 配置字典)对。Notebook 中的完整示例clustering_config [ (activation, {n_clusters: 15}), (activation_18, {n_clusters: 15}), (activation_36, {n_clusters: 15}), (activation_54, {n_clusters: 15}) ]其中第一项是基线模型中的层名activation、activation_18、activation_36、activation_54是 ResNet 各阶段的激活层其输出激活将被聚类第二项中的n_clusters指定该层聚类的簇数即概念数。Notebook 也给出了一段供调试/测试用的精简配置注释# clustering_config [ # (activation, {n_clusters: 10}), # (activation_54, {n_clusters: 10, filters: [16, 16, 16, 8]}) # ]创建 ACModel 并构建聚类模型new_acm ac_model.ACModel(model, clustering_config, work_dirwork_dir) new_acm.build_clustering_models()从源码看build_clustering_modelsac_model.py会为每个激活层实例化一个ConvIDEC来自 dec_da 库的卷积 DEC 模型自动读取该层激活的input_shape并用 Adam 优化器、loss[kld, mse]、loss_weights[0.1, 1.0]编译——其中kld对应 DEC 的 KL 散度聚类损失mse对应自编码器重构损失。训练循环epochs 15 maxiter 980 new_acm.fit(activations_dictactivations_dict, epochsepochs, maxitermaxiter)fitac_model.py依次完成三件事拟合各层聚类模型对每个激活执行 DEC 的两阶段训练——先用自编码器以epochs个 epoch 预训练pretrain再以maxiter次迭代做聚类精调fitbatch_size 固定为 32模型保存到{work_dir}/clustering_{activation_name}/拟合经验后验概率将训练样本的簇分配与真实类别做计数统计并归一化得到(n_clusters, n_classes)的经验后验矩阵存入{work_dir}/empirical_posteriors/缓存训练嵌入用训练好的聚类编码器将所有训练样本映射为嵌入向量保存为{work_dir}/training_embeddings.npz供后续最近邻查询使用。Notebook 注释也提示epochs2, maxiter280可用于缩短训练时间做调试该实现基于 DECdec_da 库中还有其他参数可通过修改activation_clustering库暴露后配置。相似样本与概念可视化similar_images_concepts.ipynb 详解examples/cifar10/similar_images_concepts.ipynb 直接复用镜像中预下载的work_dir恢复已训练模型acm ac_model.ACModel.restore(work_dir)restoreac_model.py会按顺序恢复clustering_config.yaml配置 →baseline_model.h5及可选的activation_model.h5→ 各层聚类模型权重model_final.h5→ 经验后验empirical_posteriors.joblib→ 训练嵌入training_embeddings.npz。作为代理模型评估Notebook 首先验证激活聚类模型可作为基线模型的代理# 代理模型自身精度 print(surrogate model accuracy: , acm.evaluate(featurestest_features, ytest_labels)) # 保真度代理模型与基线模型预测的一致性 baseline_labels np.argmax(acm.baseline_model.predict(test_features), axis-1) print(fidelity: , acm.evaluate(featurestest_features, ybaseline_labels))源码中evaluate通过predict得到代理模型预测的类别再与y计算准确率当y为真实标签时得到代理模型精度当y为基线模型预测时得到保真度fidelity。predict_proba的实现ac_model.py说明其原理将各层簇分配的软分数s与该层经验后验矩阵h做矩阵乘法得到该层对类别的概率贡献再按权重w加权平均。查询相似训练样本Notebook 随机抽取 10 个测试样本用query检索嵌入空间中最近的训练样本equal [1.0, 1.0, 1.0, 1.0] low [2.0, 1.0, 0.0, 0.0] high [0.0, 0.0, 1.0, 2.0] ind acm.query(featurestest_feat, weightsequal) train_image_arrays_list train_features[ind] utils.visualize_similar( test_image_arraystest_feat, train_image_arrays_listtrain_image_arrays_list, test_labelstest_labels[test_indices].tolist(), train_labelstrain_labels[ind].tolist())weights列表与clustering_config一一对应控制各层嵌入在距离计算中的相对权重。源码queryac_model.py先对各层提取测试嵌入再用scipy.spatial.distance.cdist计算与训练嵌入的欧氏距离矩阵按权重求和后取最近的前k个默认k10训练样本索引。示例表明偏重浅层低权重给高层会得到视觉上更相似的图像偏重深层则更强调语义相似。Notebook 还对比了仅用最后一层原始激活距离检索的效果结论是它无法捕捉低级视觉特征——这正是激活聚类在嵌入空间中做最近邻的优势所在。提取与可视化概念将每个聚类簇视作一个概念用距各簇质心最近的训练图像代表该概念concept_indices acm.concept_indices() activation_index 0 print(Concepts based on {}.format(acm.activation_names[activation_index])) train_image_arrays_list train_features[concept_indices[activation_index]] utils.visualize_concepts(train_image_arrays_list)concept_indicesac_model.py先从各聚类模型的clustering层取出簇质心get_centroids_list再对每个质心返回训练嵌入中最近的前k个样本索引形状为(n_clusters, k)。Notebook 依次可视化第 0、2、3 个激活层的概念并明确指出越早的激活层捕捉低级视觉特征越深的层则对应更高级的语义概念。可视化函数visualize_similar、visualize_concepts实现在 utils.py后者会为每行图片标注 Top N training images of concept i。核心参数与自定义说明综合源码与 Notebook可自定义的关键参数如下参数所属位置含义与取值默认值activation_namesclustering_config基线模型待聚类激活的层名列表无必填n_clustersclustering_config每项该层激活划分的簇/概念数无必填filtersclustering_config每项可选内部卷积自编码器各层滤波器数与嵌入维度必须为长度为 4 的正整数列表最后一位为嵌入维度违反时抛出NotImplementedError[32, 64, 128, 20]work_dirACModel构造参数缓存激活、聚类模型、经验后验与训练嵌入的工作目录/tmp/acmodelrestoreACModel构造参数是否从work_dir恢复模型Falseactivation_modelACModel构造参数用于提取激活的模型缺省时即基线模型baseline_modelepochsfitDEC 自编码器预训练 epoch 数3maxiterfitDEC 聚类精调的最大迭代次数280weightsquery/predict_proba各激活层距离/概率的加权系数无需归一化全1.0等权kquery/concept_indices返回最近邻样本数量10工作原理与适用限制从实现结构看整个激活聚类模型是一条可解释代理流水线激活提取utils.get_activations通过tf.keras.backend.function将模型输入占位符映射到指定层的输出张量按 1024 的 batch 分批前向计算utils.py聚类建模每个激活层对应一个ConvIDEC卷积 DEC自编码器负责降维嵌入聚类层负责将嵌入划分到n_clusters个簇build_clustering_models还会用batched_predict_on_batchbatch_size1024monkey-patch 各模型的predict方法规避大数组推理的内存压力经验后验簇分配经训练标签统计归一化后构成从簇到类别的概率映射ac_model.py推理与解释predict_proba输出代理模型的类别概率query/concept_indices在训练嵌入空间中做加权欧氏最近邻分别回答与某测试样本相似的训练样本有哪些与某概念的代表图像是什么。需要注意的是本项目以 TensorFlow 2.1、Python 3.6 及固定版本依赖运行且示例仅覆盖 CIFAR-10 图像分类场景迁移到其他数据集/模型时需要自行准备基线模型与层名清单filters必须为 4 个正整数最后一个为嵌入维度这是 dec_da 库的硬性约束。结语activation_clustering提供了一个完整的无监督聚类解释深度网络参考实现从 Docker 一键环境、CIFAR-10 端到端训练到相似样本检索与概念可视化再到ACModel/utils的源码级机制均可直接在 examples/cifar10/ 的 Notebook 中复现。对于希望在图像分类模型上获得白盒式解释、检索训练数据证据或提炼概念原型的开发者这套实现是值得直接上手与二次开发的基线。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门