[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-philipperemy--keract":3,"tool-philipperemy--keract":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",160784,2,"2026-04-19T11:32:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",109154,"2026-04-18T11:18:24",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},6121,"gemini-cli","google-gemini\u002Fgemini-cli","gemini-cli 是一款由谷歌推出的开源 AI 命令行工具，它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言，它提供了一条从输入提示词到获取模型响应的最短路径，无需切换窗口即可享受智能辅助。\n\n这款工具主要解决了开发过程中频繁上下文切换的痛点，让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用，还是执行复杂的 Git 操作，gemini-cli 都能通过自然语言指令高效处理。\n\n它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口，具备出色的逻辑推理能力；内置 Google 搜索、文件操作及 Shell 命令执行等实用工具；更独特的是，它支持 MCP（模型上下文协议），允许用户灵活扩展自定义集成，连接如图像生成等外部能力。此外，个人谷歌账号即可享受免费的额度支持，且项目基于 Apache 2.0 协议完全开源，是提升终端工作效率的理想助手。",100752,"2026-04-10T01:20:03",[52,13,15,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":32,"last_commit_at":59,"category_tags":60,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":78,"owner_email":79,"owner_twitter":73,"owner_website":80,"owner_url":81,"languages":82,"stars":87,"forks":88,"last_commit_at":89,"license":90,"difficulty_score":32,"env_os":91,"env_gpu":92,"env_ram":92,"env_deps":93,"category_tags":100,"github_topics":101,"view_count":32,"oss_zip_url":110,"oss_zip_packed_at":110,"status":17,"created_at":111,"updated_at":112,"faqs":113,"releases":142},9637,"philipperemy\u002Fkeract","keract","Layers Outputs and Gradients in Keras. Made easy.","Keract 是一款专为 Keras 和 TensorFlow 模型设计的轻量级开源工具，旨在让开发者轻松获取神经网络中每一层的激活值（输出）与梯度。在深度学习模型调试、可解释性研究或知识蒸馏等场景中，用户往往需要深入观察模型内部状态，但原生框架提取这些中间层数据通常代码繁琐且容易出错。Keract 通过简洁的 API 一键解决这一痛点，支持将任意层的输出转换为 NumPy 数组，并提供热力图可视化功能，直观展示卷积神经网络关注图像的区域。\n\n该工具特别适合 AI 研究人员、算法工程师及深度学习爱好者使用。无论是分析 LSTM、卷积网络还是复杂的预训练模型（如 VGG、MobileNet），Keract 都能帮助用户快速洞察模型行为。其技术亮点在于灵活的输出格式配置（支持按层名、全名或序号索引），以及对多输入模型的良好支持。此外，它还具备将激活数据持久化存储为 JSON 的功能，便于后续离线分析。需要注意的是，目前 Keract 主要兼容 TensorFlow 2.9 至 2.15 版本，尚未适配最新的 2.16+ 版本，使用前请确认环境匹配。通过 Keract，探索黑盒模型内部机制变","Keract 是一款专为 Keras 和 TensorFlow 模型设计的轻量级开源工具，旨在让开发者轻松获取神经网络中每一层的激活值（输出）与梯度。在深度学习模型调试、可解释性研究或知识蒸馏等场景中，用户往往需要深入观察模型内部状态，但原生框架提取这些中间层数据通常代码繁琐且容易出错。Keract 通过简洁的 API 一键解决这一痛点，支持将任意层的输出转换为 NumPy 数组，并提供热力图可视化功能，直观展示卷积神经网络关注图像的区域。\n\n该工具特别适合 AI 研究人员、算法工程师及深度学习爱好者使用。无论是分析 LSTM、卷积网络还是复杂的预训练模型（如 VGG、MobileNet），Keract 都能帮助用户快速洞察模型行为。其技术亮点在于灵活的输出格式配置（支持按层名、全名或序号索引），以及对多输入模型的良好支持。此外，它还具备将激活数据持久化存储为 JSON 的功能，便于后续离线分析。需要注意的是，目前 Keract 主要兼容 TensorFlow 2.9 至 2.15 版本，尚未适配最新的 2.16+ 版本，使用前请确认环境匹配。通过 Keract，探索黑盒模型内部机制变得简单高效。","# Keract: Keras Activations + Gradients\n\n### Looking for contributors to upgrade this lib to Tensorflow 2.16+\n\n\n[![Downloads](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_313c30ce40ab.png)](https:\u002F\u002Fpepy.tech\u002Fproject\u002Fkeract)\n[![Downloads](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_313c30ce40ab.png\u002Fmonth)](https:\u002F\u002Fpepy.tech\u002Fproject\u002Fkeract)\n![Keract CI](https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fworkflows\u002FKeract%20CI\u002Fbadge.svg) \n\nTested with Tensorflow 2.9, 2.10, 2.11, 2.12, 2.13, 2.14 and 2.15 (Nov 17, 2023).\n\nNot compatible with Tensorflow 2.16+.\n\n```bash\npip install keract\n```\n\n*You have just found a way to get the activations (outputs) and gradients for each layer of your Tensorflow\u002FKeras model (LSTM, conv nets...).*\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_b56fdb776401.png\">\n\u003C\u002Fp>\n\n**Important Note**: The nested models are not well supported. The recent versions of Tensorflow made it extremely tricky to extract the layer outputs reliably. Please refer to the example section to see what is possible.\n\n## API\n\n- [get_activations](#get-activations-nodeslayers-outputs-as-numpy-arrays)\n- [display_activations](#display-the-activations-youve-obtained)\n- [display_heatmaps](#display-the-activations-as-a-heatmap-overlaid-on-an-image)\n- [get_gradients_of_trainable_weights](#get-gradients-of-weights)\n- [get_gradients_of_activations](#get-gradients-of-activations)\n- [persist_to_json_file](#persist-activations-to-json)\n- [load_activations_from_json_file](#load-activations-from-json)\n\n### Get activations (nodes\u002Flayers outputs as Numpy arrays)\n\n```python\nkeract.get_activations(model, x, layer_names=None, nodes_to_evaluate=None, output_format='simple', nested=False, auto_compile=True)\n```\n\nFetch activations (nodes\u002Flayers outputs as Numpy arrays) for a Keras model and an input X.\nBy default, all the activations for all the layers are returned.\n\n- `model`: Keras compiled model or one of ['vgg16', 'vgg19', 'inception_v3', 'inception_resnet_v2',\n    'mobilenet_v2', 'mobilenetv2', ...].\n- `x`: Numpy array to feed the model as input. In the case of multi-inputs, `x` should be of type List.\n- `layer_names`: (optional) Single name of a layer or list of layer names for which activations should be\n    returned. It is useful in very big networks when it is computationally expensive to evaluate all the layers\u002Fnodes.\n- `nodes_to_evaluate`: (optional) List of Keras nodes to be evaluated.\n- `output_format`: Change the output dictionary key of the function.\n   - `simple`: output key will match the names of the Keras layers. For example Dense(1, name='d1') will\n    return {'d1': ...}.\n   - `full`: output key will match the full name of the output layer name. In the example above, it will\n    return {'d1\u002FBiasAdd:0': ...}.\n   - `numbered`: output key will be an index range, based on the order of definition of each layer within the model.\n- `nested`: If specified, will move recursively through the model definition to retrieve nested layers. Recursion ends at leaf layers of the model tree or at layers with their name specified in `layer_names`. For example a Sequential model in another Sequential model is considered nested.\n- `auto_compile`: If set to True, will auto-compile the model if needed.\n\nReturns: Dict {layer_name (specified by output_format) -> activation of the layer output\u002Fnode (Numpy array)}.\n\n*Example*\n\n```python\nimport numpy as np\nfrom tensorflow.keras import Input, Model\nfrom tensorflow.keras.layers import Dense, concatenate\nfrom keract import get_activations\n\n# model definition\ni1 = Input(shape=(10,), name='i1')\ni2 = Input(shape=(10,), name='i2')\n\na = Dense(1, name='fc1')(i1)\nb = Dense(1, name='fc2')(i2)\n\nc = concatenate([a, b], name='concat')\nd = Dense(1, name='out')(c)\nmodel = Model(inputs=[i1, i2], outputs=[d])\n\n# inputs to the model\nx = [np.random.uniform(size=(32, 10)), np.random.uniform(size=(32, 10))]\n\n# call to fetch the activations of the model.\nactivations = get_activations(model, x, auto_compile=True)\n\n# print the activations shapes.\n[print(k, '->', v.shape, '- Numpy array') for (k, v) in activations.items()]\n\n# Print output:\n# i1 -> (32, 10) - Numpy array\n# i2 -> (32, 10) - Numpy array\n# fc1 -> (32, 1) - Numpy array\n# fc2 -> (32, 1) - Numpy array\n# concat -> (32, 2) - Numpy array\n# out -> (32, 1) - Numpy array\n```\n\n### Display the activations you've obtained\n\n```python\nkeract.display_activations(activations, cmap=None, save=False, directory='.', data_format='channels_last', fig_size=(24, 24), reshape_1d_layers=False)\n```\n\nPlot the activations for each layer using matplotlib\n\nInputs are:\n- `activations`: dict - a dictionary mapping layers to their activations (the output of get_activations)\n- `cmap`: (optional) string - a valid matplotlib colormap to be used\n- `save`: (optional) bool - if True the images of the activations are saved rather than being shown\n- `directory`: (optional) string - where to store the activations (if save is True)\n- `data_format`: (optional) string - one of \"channels_last\" (default) or \"channels_first\".\n- `reshape_1d_layers`: (optional) bool - tries to reshape large 1d layers to a square\u002Frectangle.\n- `fig_size`: (optional) (float, float) - width, height in inches.\n\nThe ordering of the dimensions in the inputs. \"channels_last\" corresponds to inputs with shape (batch, steps, channels) (default format for temporal data in Keras) while \"channels_first\" corresponds to inputs with shape (batch, channels, steps).\n\n### Display the activations as a heatmap overlaid on an image\n\n```python\nkeract.display_heatmaps(activations, input_image, directory='.', save=False, fix=True, merge_filters=False)\n```\n\nPlot heatmaps of activations for all filters overlayed on the input image for each layer\n\nInputs are:\n- `activations`: a dictionary mapping layers to their activations (the output of get_activations).\n- `input_image`:  numpy array - the image that was passed as x to get_activations.\n- `directory`: (optional) string - where to store the heatmaps (if save is True).\n- `save`: (optional) bool - if True the heatmaps are saved rather than being shown.\n- `fix`: (optional) bool - if True automated checks and fixes for incorrect images will be ran.\n- `merge_filters`: (optional) bool - if True one heatmap (with all the filters averaged together) is produced for each layer, if False a heatmap is produced for each filter in each layer\n\n### Get gradients of weights\n\n```python\nkeract.get_gradients_of_trainable_weights(model, x, y)\n```\n\n- `model`: a `keras.models.Model` object.\n- `x`: Numpy array to feed the model as input. In the case of multi-inputs, `x` should be of type List.\n- `y`: Labels (numpy array). Keras convention.\n\nThe output is a dictionary mapping each trainable weight to the values of its gradients (regarding x and y).\n\n### Get gradients of activations\n\n```python\nkeract.get_gradients_of_activations(model, x, y, layer_name=None, output_format='simple')\n```\n\n- `model`: a `keras.models.Model` object.\n- `x`: Numpy array to feed the model as input. In the case of multi-inputs, `x` should be of type List.\n- `y`: Labels (numpy array). Keras convention.\n- `layer_name`: (optional) Name of a layer for which activations should be returned.\n- `output_format`: Change the output dictionary key of the function.\n   - `simple`: output key will match the names of the Keras layers. For example Dense(1, name='d1') will\n    return {'d1': ...}.\n   - `full`: output key will match the full name of the output layer name. In the example above, it will\n    return {'d1\u002FBiasAdd:0': ...}.\n   - `numbered`: output key will be an index range, based on the order of definition of each layer within the model.\n\nReturns: Dict {layer_name (specified by output_format) -> grad activation of the layer output\u002Fnode (Numpy array)}.\n\nThe output is a dictionary mapping each layer to the values of its gradients (regarding x and y).\n\n### Persist activations to JSON\n\n```python\nkeract.persist_to_json_file(activations, filename)\n```\n\n- `activations`: activations (dict mapping layers)\n- `filename`: output filename (JSON format)\n\n### Load activations from JSON\n\n```python\nkeract.load_activations_from_json_file(filename)\n```\n\n- `filename`: filename to read the activations from (JSON format)\n\nIt returns the activations.\n\n## Examples\n\nExamples are provided for:\n- `keras.models.Sequential` - mnist.py\n- `keras.models.Model` - multi_inputs.py\n- Recurrent networks - recurrent.py\n\nIn the case of MNIST with LeNet, we are able to fetch the activations for a batch of size 128:\n\n```\nconv2d_1\u002FRelu:0\n(128, 26, 26, 32)\n\nconv2d_2\u002FRelu:0\n(128, 24, 24, 64)\n\nmax_pooling2d_1\u002FMaxPool:0\n(128, 12, 12, 64)\n\ndropout_1\u002Fcond\u002FMerge:0\n(128, 12, 12, 64)\n\nflatten_1\u002FReshape:0\n(128, 9216)\n\ndense_1\u002FRelu:0\n(128, 128)\n\ndropout_2\u002Fcond\u002FMerge:0\n(128, 128)\n\ndense_2\u002FSoftmax:0\n(128, 10)\n```\n\nWe can visualise the activations. Here's another example using VGG16:\n\n```bash\ncd examples\npip install -r examples-requirements.txt\npython vgg16.py\n```\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_28e76858d59e.jpg\">\n  \u003Cbr>\u003Ci>A cat.\u003C\u002Fi>\n\u003C\u002Fp>\n\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_ff87c59f8fc5.png\" width=\"600\">\n  \u003Cbr>\u003Ci>Outputs of the first convolutional layer of VGG16.\u003C\u002Fi>\n\u003C\u002Fp>\n\nAlso, we can visualise the heatmaps of the activations:\n\n```bash\ncd examples\npip install -r examples-requirements.txt\npython heat_map.py\n```\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_eb98e5d61068.png\">\n\u003C\u002Fp>\n\n## Limitations \u002F Ways of improvement\n\nIn some specific cases, Keract does not handle well some models that contain submodels. Feel free to fork this repo and propose a PR to fix it!\n\n## Citation\n\n```\n@misc{Keract,\n  author = {Philippe Remy},\n  title = {Keract: A library for visualizing activations and gradients},\n  year = {2020},\n  publisher = {GitHub},\n  journal = {GitHub repository},\n  howpublished = {\\url{https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract}},\n}\n```\n\n## Contributors\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fgraphs\u002Fcontributors\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_91ced8230d4e.png\" \u002F>\n\u003C\u002Fa>\n\n","# Keract: Keras 激活值 + 梯度\n\n### 寻求贡献者将此库升级至 Tensorflow 2.16+\n\n[![下载量](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_313c30ce40ab.png)](https:\u002F\u002Fpepy.tech\u002Fproject\u002Fkeract)\n[![月下载量](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_313c30ce40ab.png\u002Fmonth)](https:\u002F\u002Fpepy.tech\u002Fproject\u002Fkeract)\n![Keract CI](https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fworkflows\u002FKeract%20CI\u002Fbadge.svg) \n\n已在 Tensorflow 2.9、2.10、2.11、2.12、2.13、2.14 和 2.15 上测试过（2023年11月17日）。\n\n不兼容 Tensorflow 2.16 及以上版本。\n\n```bash\npip install keract\n```\n\n*您刚刚找到了一种方法，可以获取 TensorFlow\u002FKeras 模型（LSTM、卷积网络等）中每一层的激活值（输出）和梯度。*\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_b56fdb776401.png\">\n\u003C\u002Fp>\n\n**重要提示**：嵌套模型支持不佳。TensorFlow 的最新版本使得可靠地提取层输出变得极其困难。请参阅示例部分，了解可行的操作。\n\n## API\n\n- [get_activations](#get-activations-nodeslayers-outputs-as-numpy-arrays)\n- [display_activations](#display-the-activations-youve-obtained)\n- [display_heatmaps](#display-the-activations-as-a-heatmap-overlaid-on-an-image)\n- [get_gradients_of_trainable_weights](#get-gradients-of-weights)\n- [get_gradients_of_activations](#get-gradients-of-activations)\n- [persist_to_json_file](#persist-activations-to-json)\n- [load_activations_from_json_file](#load-activations-from-json)\n\n### 获取激活值（节点\u002F层的输出为 NumPy 数组）\n\n```python\nkeract.get_activations(model, x, layer_names=None, nodes_to_evaluate=None, output_format='simple', nested=False, auto_compile=True)\n```\n\n为 Keras 模型和输入 X 获取激活值（节点\u002F层的输出为 NumPy 数组）。默认情况下，会返回所有层的所有激活值。\n\n- `model`: 已编译的 Keras 模型，或以下之一：['vgg16', 'vgg19', 'inception_v3', 'inception_resnet_v2',\n    'mobilenet_v2', 'mobilenetv2', ...]。\n- `x`: 作为输入馈送到模型的 NumPy 数组。如果是多输入，则 `x` 应为 List 类型。\n- `layer_names`: （可选）要返回激活值的单个层名或层名列表。在非常大的网络中，计算评估所有层\u002F节点的开销较高时，此参数很有用。\n- `nodes_to_evaluate`: （可选）要评估的 Keras 节点列表。\n- `output_format`: 更改函数输出字典的键。\n   - `simple`: 输出键将与 Keras 层的名称匹配。例如 Dense(1, name='d1') 将返回 {'d1': ...}。\n   - `full`: 输出键将与输出层的完整名称匹配。在上述示例中，它将返回 {'d1\u002FBiasAdd:0': ...}。\n   - `numbered`: 输出键将是基于模型中各层定义顺序的索引范围。\n- `nested`: 如果指定，将递归遍历模型定义以检索嵌套层。递归将在模型树的叶层或 `layer_names` 中指定名称的层处结束。例如，一个 Sequential 模型嵌套在另一个 Sequential 模型中被视为嵌套。\n- `auto_compile`: 如果设置为 True，将在需要时自动编译模型。\n\n返回值：字典 {层名（由 output_format 指定）-> 层输出\u002F节点的激活值（NumPy 数组）}。\n\n*示例*\n\n```python\nimport numpy as np\nfrom tensorflow.keras import Input, Model\nfrom tensorflow.keras.layers import Dense, concatenate\nfrom keract import get_activations\n\n# 模型定义\ni1 = Input(shape=(10,), name='i1')\ni2 = Input(shape=(10,), name='i2')\n\na = Dense(1, name='fc1')(i1)\nb = Dense(1, name='fc2')(i2)\n\nc = concatenate([a, b], name='concat')\nd = Dense(1, name='out')(c)\nmodel = Model(inputs=[i1, i2], outputs=[d])\n\n# 模型输入\nx = [np.random.uniform(size=(32, 10)), np.random.uniform(size=(32, 10))]\n\n# 调用以获取模型的激活值。\nactivations = get_activations(model, x, auto_compile=True)\n\n# 打印激活值的形状。\n[print(k, '->', v.shape, '- Numpy array') for (k, v) in activations.items()]\n\n# 输出：\n# i1 -> (32, 10) - Numpy array\n# i2 -> (32, 10) - Numpy array\n# fc1 -> (32, 1) - Numpy array\n# fc2 -> (32, 1) - Numpy array\n# concat -> (32, 2) - Numpy array\n# out -> (32, 1) - Numpy array\n```\n\n### 显示您获得的激活值\n\n```python\nkeract.display_activations(activations, cmap=None, save=False, directory='.', data_format='channels_last', fig_size=(24, 24), reshape_1d_layers=False)\n```\n\n使用 matplotlib 绘制各层的激活值。\n\n输入参数：\n- `activations`: 字典 - 将层映射到其激活值的字典（get_activations 的输出）。\n- `cmap`: （可选）字符串 - 有效的 matplotlib 颜色映射。\n- `save`: （可选）布尔值 - 如果为 True，则保存激活值图像而不是显示。\n- `directory`: （可选）字符串 - 保存激活值的位置（如果 save 为 True）。\n- `data_format`: （可选）字符串 - 取值为 \"channels_last\"（默认）或 \"channels_first\"。\n- `reshape_1d_layers`: （可选）布尔值 - 尝试将大型 1D 层重塑为正方形或矩形。\n- `fig_size`: （可选）(float, float) - 宽度、高度，单位为英寸。\n\n输入数据的维度顺序。\"channels_last\" 对应于形状为 (batch, steps, channels) 的输入（Keras 中时间序列数据的默认格式），而 \"channels_first\" 对应于形状为 (batch, channels, steps) 的输入。\n\n### 将激活值以热图形式叠加在图像上显示\n\n```python\nkeract.display_heatmaps(activations, input_image, directory='.', save=False, fix=True, merge_filters=False)\n```\n\n为每层的所有滤波器绘制激活值热图，并将其叠加在输入图像上。\n\n输入参数：\n- `activations`: 将层映射到其激活值的字典（get_activations 的输出）。\n- `input_image`: NumPy 数组 - 作为 x 传递给 get_activations 的图像。\n- `directory`: （可选）字符串 - 存储热图的位置（如果 save 为 True）。\n- `save`: （可选）布尔值 - 如果为 True，则保存热图而不是显示。\n- `fix`: （可选）布尔值 - 如果为 True，将对错误的图像进行自动检查和修复。\n- `merge_filters`: （可选）布尔值 - 如果为 True，则为每层生成一张包含所有滤波器平均值的热图；如果为 False，则为每层中的每个滤波器分别生成一张热图。\n\n### 获取可训练权重的梯度\n\n```python\nkeract.get_gradients_of_trainable_weights(model, x, y)\n```\n\n- `model`: 一个 `keras.models.Model` 对象。\n- `x`: 作为输入馈送到模型的 NumPy 数组。如果是多输入，则 `x` 应为 List 类型。\n- `y`: 标签（NumPy 数组）。遵循 Keras 规范。\n\n输出是一个字典，将每个可训练权重映射到其关于 x 和 y 的梯度值。\n\n### 获取激活值的梯度\n\n```python\nkeract.get_gradients_of_activations(model, x, y, layer_name=None, output_format='simple')\n```\n\n- `model`: 一个 `keras.models.Model` 对象。\n- `x`: 用于作为模型输入的 NumPy 数组。如果是多输入情况，`x` 应为列表类型。\n- `y`: 标签（NumPy 数组）。遵循 Keras 的约定。\n- `layer_name`: （可选）指定要返回激活值的层名称。\n- `output_format`: 改变函数输出字典的键名格式。\n   - `simple`: 输出键将与 Keras 层的名称一致。例如，Dense(1, name='d1') 将返回 {'d1': ...}。\n   - `full`: 输出键将与输出层的完整名称匹配。在上述例子中，它将返回 {'d1\u002FBiasAdd:0': ...}。\n   - `numbered`: 输出键将是基于模型中各层定义顺序的索引范围。\n\n返回值：字典 {层名称（由 output_format 指定） -> 该层输出\u002F节点的梯度激活值（NumPy 数组）}。\n\n输出是一个字典，将每一层映射到其关于输入 `x` 和标签 `y` 的梯度值。\n\n### 将激活值保存为 JSON 文件\n\n```python\nkeract.persist_to_json_file(activations, filename)\n```\n\n- `activations`: 激活值（层到数值的字典）\n- `filename`: 输出文件名（JSON 格式）\n\n### 从 JSON 文件加载激活值\n\n```python\nkeract.load_activations_from_json_file(filename)\n```\n\n- `filename`: 要读取激活值的文件名（JSON 格式）\n\n返回激活值。\n\n## 示例\n\n提供了以下示例：\n- `keras.models.Sequential` - mnist.py\n- `keras.models.Model` - multi_inputs.py\n- 循环神经网络 - recurrent.py\n\n以 LeNet 网络处理 MNIST 数据集为例，我们可以获取批次大小为 128 的激活值：\n\n```\nconv2d_1\u002FRelu:0\n(128, 26, 26, 32)\n\nconv2d_2\u002FRelu:0\n(128, 24, 24, 64)\n\nmax_pooling2d_1\u002FMaxPool:0\n(128, 12, 12, 64)\n\ndropout_1\u002Fcond\u002FMerge:0\n(128, 12, 12, 64)\n\nflatten_1\u002FReshape:0\n(128, 9216)\n\ndense_1\u002FRelu:0\n(128, 128)\n\ndropout_2\u002Fcond\u002FMerge:0\n(128, 128)\n\ndense_2\u002FSoftmax:0\n(128, 10)\n```\n\n我们可以对这些激活值进行可视化。以下是使用 VGG16 的另一个示例：\n\n```bash\ncd examples\npip install -r examples-requirements.txt\npython vgg16.py\n```\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_28e76858d59e.jpg\">\n  \u003Cbr>\u003Ci>一只猫。\u003C\u002Fi>\n\u003C\u002Fp>\n\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_ff87c59f8fc5.png\" width=\"600\">\n  \u003Cbr>\u003Ci>VGG16 第一卷积层的输出。\u003C\u002Fi>\n\u003C\u002Fp>\n\n此外，我们还可以可视化激活值的热图：\n\n```bash\ncd examples\npip install -r examples-requirements.txt\npython heat_map.py\n```\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_eb98e5d61068.png\">\n\u003C\u002Fp>\n\n## 限制与改进方向\n\n在某些特定情况下，Keract 对包含子模型的复杂模型支持不够完善。欢迎 fork 本仓库并提交 PR 来修复这些问题！\n\n## 引用\n\n```\n@misc{Keract,\n  author = {Philippe Remy},\n  title = {Keract：用于可视化激活值和梯度的库},\n  year = {2020},\n  publisher = {GitHub},\n  journal = {GitHub 仓库},\n  howpublished = {\\url{https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract}},\n}\n```\n\n## 贡献者\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fgraphs\u002Fcontributors\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_readme_91ced8230d4e.png\" \u002F>\n\u003C\u002Fa>","# Keract 快速上手指南\n\nKeract 是一个用于提取和可视化 TensorFlow\u002FKeras 模型各层激活值（Activations）和梯度（Gradients）的轻量级库。它支持 LSTM、卷积神经网络等多种架构，帮助开发者直观地理解模型内部运作。\n\n> **注意**：当前版本兼容 TensorFlow 2.9 至 2.15。**暂不支持** TensorFlow 2.16 及以上版本。\n\n## 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**：Linux, macOS 或 Windows\n*   **Python 版本**：3.7+\n*   **核心依赖**：\n    *   TensorFlow (版本范围：2.9 - 2.15)\n    *   Keras (通常随 TensorFlow 内置)\n    *   Matplotlib (用于可视化)\n    *   NumPy\n\n## 安装步骤\n\n您可以直接使用 pip 进行安装。国内用户推荐使用清华或阿里镜像源以加速下载。\n\n**标准安装：**\n```bash\npip install keract\n```\n\n**使用国内镜像源加速安装：**\n```bash\npip install keract -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n## 基本使用\n\n以下是最简单的使用示例，演示如何构建一个多输入模型并提取所有层的激活值。\n\n### 1. 提取激活值 (Get Activations)\n\n此代码将创建一个简单的 Keras 模型，传入随机数据，并获取每一层的输出张量（Numpy 数组）。\n\n```python\nimport numpy as np\nfrom tensorflow.keras import Input, Model\nfrom tensorflow.keras.layers import Dense, concatenate\nfrom keract import get_activations\n\n# 1. 定义模型\ni1 = Input(shape=(10,), name='i1')\ni2 = Input(shape=(10,), name='i2')\n\na = Dense(1, name='fc1')(i1)\nb = Dense(1, name='fc2')(i2)\n\nc = concatenate([a, b], name='concat')\nd = Dense(1, name='out')(c)\nmodel = Model(inputs=[i1, i2], outputs=[d])\n\n# 2. 准备输入数据 (多输入情况下 x 应为列表)\nx = [np.random.uniform(size=(32, 10)), np.random.uniform(size=(32, 10))]\n\n# 3. 获取激活值\n# auto_compile=True 会在需要时自动编译模型\nactivations = get_activations(model, x, auto_compile=True)\n\n# 4. 打印结果形状\nfor layer_name, activation in activations.items():\n    print(f\"{layer_name} -> {activation.shape}\")\n```\n\n**输出示例：**\n```text\ni1 -> (32, 10)\ni2 -> (32, 10)\nfc1 -> (32, 1)\nfc2 -> (32, 1)\nconcat -> (32, 2)\nout -> (32, 1)\n```\n\n### 2. 可视化激活值 (Display Activations)\n\n获取激活值后，可以使用 `display_activations` 直接绘制图像查看。\n\n```python\nfrom keract import display_activations\n\n# 将上一步获取的 activations 字典传入\n# cmap: 颜色映射，save: 是否保存文件，fig_size: 画布大小\ndisplay_activations(activations, cmap=\"viridis\", save=False, fig_size=(12, 12))\n```\n\n### 3. 进阶功能：热力图与梯度\n\n除了基础激活值，Keract 还支持生成叠加在原图上的热力图以及计算梯度。\n\n*   **生成热力图** (适用于图像模型，如 VGG, ResNet)：\n    ```python\n    from keract import display_heatmaps\n    # input_image 是原始输入图像的 numpy 数组\n    display_heatmaps(activations, input_image, save=False)\n    ```\n\n*   **获取权重梯度**：\n    ```python\n    from keract import get_gradients_of_trainable_weights\n    # y 是对应的标签\n    gradients = get_gradients_of_trainable_weights(model, x, y)\n    ```\n\n*   **获取激活值的梯度**：\n    ```python\n    from keract import get_gradients_of_activations\n    grad_activations = get_gradients_of_activations(model, x, y)\n    ```\n\n### 4. 数据持久化\n\n您可以将提取的激活值保存为 JSON 文件以便后续分析。\n\n```python\nfrom keract import persist_to_json_file, load_activations_from_json_file\n\n# 保存\npersist_to_json_file(activations, 'my_activations.json')\n\n# 加载\nloaded_activations = load_activations_from_json_file('my_activations.json')\n```","某计算机视觉团队正在调试一个基于 Keras 构建的复杂多输入缺陷检测模型，试图定位为何模型对微小划痕的识别率突然下降。\n\n### 没有 keract 时\n- **黑盒调试困难**：开发者无法直接查看中间层（如卷积块或拼接层）的具体输出数值，只能盲目猜测是哪一层特征提取失效。\n- **代码侵入性强**：为了获取特定层的激活值，必须手动修改模型架构，重新定义包含中间输出的新模型，过程繁琐且容易破坏原有计算图。\n- **梯度分析缺失**：难以直观获取权重梯度或特征图梯度，无法判断是数据输入问题还是反向传播过程中出现了梯度消失\u002F爆炸。\n- **可视化门槛高**：将内部张量转换为可观察的热力图或数值数组需要编写大量样板代码，严重拖慢迭代速度。\n\n### 使用 keract 后\n- **一键透视内部**：调用 `get_activations` 即可直接获取任意指定层甚至所有层的输出 NumPy 数组，无需改动原模型一行代码。\n- **精准定位故障**：通过对比正常与异常样本在各层的激活值分布，迅速发现是某个 concatenate 层后的特征发生了异常饱和。\n- **深度梯度洞察**：利用 `get_gradients_of_activations` 直接分析关键特征图的梯度响应，确认了模型确实“看”到了划痕但未能有效传递信号。\n- **即时可视化诊断**：配合 `display_heatmaps` 功能，直接将激活值以热力图形式叠加在原图上，直观验证了模型关注区域是否偏离缺陷点。\n\nkeract 将原本需要数小时的黑盒摸索工作缩短为几分钟的透明化诊断，让开发者能像做 CT 扫描一样清晰掌控模型的每一次神经冲动。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fphilipperemy_keract_b56fdb77.png","philipperemy","Philippe Rémy","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fphilipperemy_ab4d68d0.jpg","From Paris to Bangkok via London, Tokyo, LA. Ex @ImperialCollegeLondon. Maths, Stats, Machine Learning.   🏄 🎲 🎱 Co Founder of @skysense, an AI startup.","Imperial College London","Earth","premy.enseirb@gmail.com","philipperemy.github.io\u002Fme","https:\u002F\u002Fgithub.com\u002Fphilipperemy",[83],{"name":84,"color":85,"percentage":86},"Python","#3572A5",100,1058,189,"2026-04-08T13:56:51","MIT","","未说明",{"notes":94,"python":92,"dependencies":95},"该工具明确测试支持 TensorFlow 2.9 至 2.15 版本，不兼容 TensorFlow 2.16 及以上版本。对嵌套模型（nested models）的支持有限，提取层输出可能不可靠。主要功能为获取 Keras\u002FTensorFlow 模型的激活值和梯度。",[96,97,98,99],"tensorflow>=2.9,\u003C2.16","keras","numpy","matplotlib",[14],[97,102,103,104,105,106,107,108,109],"keras-neural-networks","keras-tutorials","keras-visualization","deep-learning","visualize-activations","mnist","multi-inputs","machine-learning",null,"2026-03-27T02:49:30.150509","2026-04-20T04:06:05.906410",[114,119,124,129,134,138],{"id":115,"question_zh":116,"answer_zh":117,"source_url":118},43277,"使用 display_heatmaps() 时出现 \"IndexError: too many indices for array\" 错误怎么办？","这通常是因为模型包含子模型（submodels）或输入结构复杂。解决方法是：1. 不要直接对整个模型调用，而是针对特定层获取激活值，例如使用 `get_activations(model.layers[3], x, layer_name='block14_sepconv2_act')`；2. 注意 Heatmap 功能主要是为图像和卷积层设计的，在注意力层（attention layers）上可能无法正常工作。","https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fissues\u002F67",{"id":120,"question_zh":121,"answer_zh":122,"source_url":123},43278,"调用 display_heatmaps 时遇到 \"NameError: name 'k' is not defined\" 错误如何解决？","这是因为代码中缺少对 Keras 后端的导入。请在代码文件顶部添加 `import tensorflow.keras.backend as K`（或者根据你使用的版本导入相应的 backend）。如果问题仍然存在，尝试降级 keract 或 TensorFlow\u002FKeras 的版本以匹配兼容性。","https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fissues\u002F69",{"id":125,"question_zh":126,"answer_zh":127,"source_url":128},43279,"在使用微调后的预训练模型（如 ResNet50）并传入自定义输入时，get_activations 失败怎么办？","不要直接使用自定义的 Input tensor。技巧是使用预训练模型默认提供的 Input tensor，并将额外信息（如时间切片数）推入第一维（batch dimension），调用预训练模型后再通过 un-squeeze 操作恢复 batch_size 和切片维度。此外，建议在运行前禁用 eager execution：`tf.compat.v1.disable_eager_execution()`。","https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fissues\u002F132",{"id":130,"question_zh":131,"answer_zh":132,"source_url":133},43280,"Keract 可以用于回归问题（Regression）吗？如何可视化结果？","可以获取回归模型的激活值，使用 `activations = get_activations(model, inputs)`。但是，通常无法直接使用 `display_activations` 或 `display_heatmaps` 进行可视化，因为回归任务的激活值形状往往是 4D 或 5D，难以直接映射到 2D 图像。建议获取激活值后，根据具体形状自行编写数据处理和绘图逻辑。","https:\u002F\u002Fgithub.com\u002Fphilipperemy\u002Fkeract\u002Fissues\u002F125",{"id":135,"question_zh":136,"answer_zh":137,"source_url":118},43281,"如何在多输入模型或多时间步（如视频帧序列）中可视化每个时间步的热图？","Keract 对子模型和多输入的支持有限。对于多时间步（如 30 帧视频），你需要手动处理输入维度。参考解决方案是：将时间步维度合并到 batch 维度中传入模型，获取激活值后，再按照原始的时间步数量切分激活值数组，最后对每个切片单独调用热图显示函数。",{"id":139,"question_zh":140,"answer_zh":141,"source_url":123},43282,"为什么在 Lambda 层调用时会出现 'K not defined' 类似的错误？","这通常是因为环境配置或版本兼容性问题导致后端别名 'K' 未被正确识别。确保在脚本开头显式导入后端：`import tensorflow.keras.backend as K`。如果是在特定的 Lambda 层逻辑中报错，检查该层内部是否隐式依赖了未导入的全局变量，并考虑降级库版本以修复潜在的兼容性 Bug。",[143,147,151,155,159,163,167,171,175,179],{"id":144,"version":145,"summary_zh":110,"released_at":146},342955,"4.5.0","2021-06-19T16:14:57",{"id":148,"version":149,"summary_zh":110,"released_at":150},342956,"4.3.4","2020-12-30T19:38:30",{"id":152,"version":153,"summary_zh":110,"released_at":154},342957,"4.3.1","2020-08-23T07:10:07",{"id":156,"version":157,"summary_zh":110,"released_at":158},342958,"2.5.6","2019-05-31T02:23:59",{"id":160,"version":161,"summary_zh":110,"released_at":162},342959,"2.5.4","2019-04-17T07:38:45",{"id":164,"version":165,"summary_zh":110,"released_at":166},342960,"2.5.3","2019-04-16T07:03:35",{"id":168,"version":169,"summary_zh":110,"released_at":170},342961,"2.5.0","2019-03-18T04:48:14",{"id":172,"version":173,"summary_zh":110,"released_at":174},342962,"2.4.0","2019-03-12T02:09:35",{"id":176,"version":177,"summary_zh":110,"released_at":178},342963,"2.2.1","2019-02-04T06:17:26",{"id":180,"version":181,"summary_zh":110,"released_at":182},342964,"2.1.1","2019-01-09T13:24:28"]