通过手写识别数字可视化学习卷积神经网络原理

1. 项目概述

本项目是一个交互式卷积神经网络(CNN)可视化工具,旨在帮助用户直观地理解卷积神经网络的工作原理。用户可以在绘图板上绘制数字,系统会实时将绘制内容输入到预训练的CNN模型中,并以3D可视化的方式展示神经网络各层的工作过程和决策依据。

2. 功能需求

2.1 绘图功能

  • 功能描述:用户可以在左侧绘图板上绘制数字
  • 技术实现:使用HTML5 Canvas结合自定义的DrawingBoard库
  • 操作方式
    • 使用鼠标在画布上绘制
    • 支持铅笔工具调整粗细和颜色
    • 提供清除画布功能

2.2 数字识别功能

  • 功能描述:系统自动识别用户绘制的数字
  • 技术实现
    • 将绘制内容下采样为28×28像素的图像
    • 输入预训练的卷积神经网络模型
    • 输出识别结果及置信度
  • 显示方式:在绘图板下方显示前两个最可能的识别结果

2.3 3D可视化功能

  • 功能描述:以3D方式展示卷积神经网络的结构和工作过程
  • 技术实现:使用Three.js库实现3D渲染
  • 展示内容
    • 神经网络各层节点(以立方体表示)
    • 节点间的连接(以线条表示)
    • 节点激活值(以颜色深浅表示)

2.4 层控制功能

  • 功能描述:允许用户控制各层神经网络的可见性
  • 技术实现:使用开关控件结合JavaScript事件处理
  • 控制选项
    • 输入层
    • 卷积层1
    • 下采样层1
    • 卷积层2
    • 下采样层2
    • 全连接层1
    • 全连接层2
    • 输出层

2.5 节点信息显示功能

  • 功能描述:鼠标悬停在节点上时显示详细信息
  • 技术实现:使用Three.js的拾取功能和HTML信息面板
  • 显示内容
    • 节点类型和所属图层
    • 节点输入值
    • 计算过程
    • 节点输出值
    • 相关的滤波器信息(针对卷积层)

3. 技术架构

3.1 前端技术栈

  • HTML5:页面结构和Canvas元素
  • CSS3:样式设计和动画效果
  • JavaScript
    • 核心逻辑实现
    • 神经网络算法
    • 3D渲染控制
  • Three.js:3D图形渲染
  • DrawingBoard.js:绘图板功能
  • jQuery:DOM操作和事件处理
  • Math.js:数学计算
  • Sylvester.js:矩阵和向量运算

3.2 项目结构

复制代码
├── cnn/
│   └── 3d.html              # 主页面文件
├── css/
│   ├── drawingboard2.css    # 绘图板样式
│   ├── katex.min.css        # 数学公式渲染样式
│   └── main.css             # 主样式文件
├── images/
│   ├── clear64.png          # 清除按钮图标
│   ├── eraser64.png         # 橡皮擦图标
│   └── pencil64.png         # 铅笔图标
└── js/
    ├── colormaps/           # 颜色映射
    │   └── myColorMap_dark.js
    ├── drawingboard/        # 绘图板功能
    │   ├── controls/
    │   │   ├── color.js
    │   │   ├── control.js
    │   │   ├── download.js
    │   │   ├── drawingmode.js
    │   │   ├── navigation.js
    │   │   └── size.js
    │   ├── board.js
    │   └── utils.js
    ├── nn/                  # 神经网络相关
    │   ├── common.js
    │   ├── conv.js
    │   ├── convnet_weights.js
    │   └── webgl_convnet2.json
    ├── GeometryUtils.js
    ├── camera.js
    ├── createText.js
    ├── droid_sans_regular.typeface.js
    ├── jquery-1.11.2.min.js
    ├── katex.min.js
    ├── math.min.js
    ├── myOrbitControls.js
    ├── processing.min.js
    ├── stats.min.js
    ├── sylvester.src.js
    └── three.min.js

3.3 神经网络结构

该项目使用的是一个经典的LeNet-5结构的卷积神经网络,包含以下层:

  1. 输入层:32×32像素的灰度图像
  2. 卷积层1:6个5×5的卷积核
  3. 下采样层1:2×2的最大池化
  4. 卷积层2:16个5×5的卷积核
  5. 下采样层2:2×2的最大池化
  6. 全连接层1:120个神经元
  7. 全连接层2:100个神经元
  8. 输出层:10个神经元(对应0-9的数字)

4. 界面设计

4.1 整体布局

  • 左侧:绘图板和识别结果显示
  • 中央:3D神经网络可视化区域
  • 右侧:神经网络层控制设置
  • 底部:节点信息显示面板

4.2 主要界面元素

4.2.1 绘图区域
  • 尺寸:282×361像素
  • 背景色:黑色
  • 绘图色:白色
  • 功能按钮:铅笔工具、颜色选择、清除画布
4.2.2 3D可视化区域
  • 背景:深色渐变
  • 节点表示:立方体,大小根据图层不同而变化
  • 连接表示:线条,颜色表示权重大小
  • 交互方式:鼠标旋转、缩放、悬停查看详情
4.2.3 控制面板
  • 尺寸:292像素宽
  • 控制选项:各层神经网络的显示/隐藏开关
  • 交互反馈:开关状态实时更新3D可视化
4.2.4 信息面板
  • 尺寸:300像素宽
  • 显示内容:节点类型、输入值、计算过程、输出值
  • 显示时机:鼠标悬停在3D节点上时显示

5. 实现细节

5.1 绘图与预处理

javascript 复制代码
// DrawingBoard库初始化
var customBoard = new DrawingBoard.Board('custom-board', {
    background: "#000",
    color: "#fff",
    size: 30,
    controls: [
        { Navigation: { back: false, forward: false } },
        { DrawingMode: { filler: false } }
    ],
    controlsPosition: "bottom right",
    webStorage: 'session',
    droppable: false
});

// 下采样处理
var tinyCtx = $("#tiny")[0].getContext("2d");
tinyCtx.scale(0.1,0.1);

5.2 神经网络计算

javascript 复制代码
// 获取神经网络输出
function getNNOutput() {
    // 1. 获取下采样后的图像数据
    // 2. 数据预处理(归一化、填充)
    // 3. 执行卷积操作
    // 4. 执行池化操作
    // 5. 执行全连接层计算
    // 6. 输出结果
}

5.3 3D可视化实现

javascript 复制代码
// 初始化3D场景
function init() {
    // 1. 创建场景、相机、渲染器
    // 2. 设置灯光
    // 3. 创建拾取纹理用于交互
    // 4. 设置事件监听
}

// 渲染3D场景
function animate() {
    requestAnimationFrame( animate );
    render();
    stats.update();
}

6. 性能优化

  1. 节点渲染优化:使用BufferGeometry减少绘制调用
  2. 计算优化:仅在用户完成绘制后执行神经网络计算
  3. 内存管理:及时释放不再需要的图像数据和计算结果
  4. 交互优化:使用拾取纹理高效检测鼠标悬停的节点

7. 未来扩展

  1. 支持更多网络结构:允许用户选择不同的神经网络模型
  2. 实时训练可视化:展示神经网络训练过程
  3. 多平台支持:优化移动端体验
  4. 教育资源整合:添加神经网络相关的教学内容
  5. 自定义网络:允许用户构建和可视化自己的神经网络结构

8. 项目贡献者

  • Adam Harley:项目创建者和主要开发者

9. 技术参考


参见:

https://adamharley.com/nn_vis/cnn/3d.html

相关推荐
卡尔AI工坊2 小时前
Andrej Karpathy:过去一年大模型的六个关键转折
人工智能·经验分享·深度学习·机器学习·ai编程
俊哥V2 小时前
[本周看点]AI算力扩张的“隐形瓶颈”——电网接入为何成为最大制约?
人工智能·ai
X54先生(人文科技)2 小时前
碳硅协同对位法:从对抗博弈到共生协奏的元协议
人工智能·架构·零知识证明
阿里云大数据AI技术2 小时前
寻找 AI 全能王——阿里云 Data+AI 工程师全球大奖赛正式开启
人工智能·阿里云·云计算·天池大赛
AI视觉网奇3 小时前
Epic linux 打包。
笔记·学习·ue5
Oflycomm3 小时前
CES 2026:高通扩展 IE-IoT 产品组合,边缘 AI 进入“平台化竞争”阶段
人工智能·物联网·高通·wifi7·ces2026·qogrisys
jay神3 小时前
指纹识别考勤打卡系统 - 完整源码项目
人工智能·深度学习·机器学习·计算机视觉·毕业设计
智慧医院运行管理解决方案专家3 小时前
当医院安全进入“自动驾驶”时代:AI机器人医院安全值守日记
人工智能·安全·自动驾驶
码农三叔3 小时前
(2-3)人形机器人的总体架构与系统工程:人形机器人的关键性能指标
人工智能·机器人·人形机器人