当前位置: 首页 > news >正文

离散Hopfield网络 (DHNN) 直接训练法:5步实现3个模式记忆与联想(附Python代码)

离散Hopfield网络实战:5步实现模式记忆与联想(附Python代码)

神经网络的世界里,Hopfield网络就像一位擅长记忆与联想的智者。想象一下,当你只记得某个电话号码的部分数字时,大脑却能自动补全完整号码——这正是Hopfield网络的拿手好戏。本文将带你用Python亲手构建这个神奇的网络,实现从理论到实践的跨越。

1. 理解Hopfield网络的核心机制

Hopfield网络本质上是一个通过能量函数收敛来存储和检索模式的动态系统。它的独特之处在于:

  • 全连接架构:每个神经元都与其他所有神经元相连,形成稠密的连接矩阵
  • 对称权重:连接权重满足w_ij = w_ji,且对角线元素为0
  • 双稳态神经元:每个神经元只有+1和-1(或0和1)两种状态

能量函数是这个网络的核心所在:

E = -0.5 * ΣΣ w_ij * x_i * x_j + Σ θ_i * x_i

这个Lyapunov函数确保网络状态会朝着能量降低的方向演化,最终稳定在某个局部最小值。我们可以通过Hebb学习规则来训练权重:

# Hebb规则实现示例 def hebbian_learning(patterns): n = len(patterns[0]) W = np.zeros((n, n)) for p in patterns: W += np.outer(p, p) np.fill_diagonal(W, 0) # 对角线置零 return W / n

注意:模式向量需要是双极值(±1)形式。如果是二值数据,需要先进行转换:(0,1) → (-1,1)

2. 构建完整的DHNN Python类

下面是一个完整的离散Hopfield网络实现,包含训练和联想两个核心功能:

import numpy as np import matplotlib.pyplot as plt class DiscreteHopfieldNetwork: def __init__(self, size): self.size = size self.W = np.zeros((size, size)) # 权重矩阵 self.theta = np.zeros(size) # 阈值 def train(self, patterns): """外积法训练""" for p in patterns: self.W += np.outer(p, p) np.fill_diagonal(self.W, 0) self.W /= len(patterns[0]) def recall(self, pattern, max_iter=100): """异步更新回忆过程""" state = np.copy(pattern) energy_history = [self._energy(state)] for _ in range(max_iter): for i in np.random.permutation(self.size): # 随机顺序更新 s = np.dot(self.W[i], state) - self.theta[i] state[i] = 1 if s >= 0 else -1 energy_history.append(self._energy(state)) if np.array_equal(state, pattern): # 收敛检测 break return state, energy_history def _energy(self, state): """计算当前状态能量""" return -0.5 * state.T @ self.W @ state + self.theta @ state def visualize_weights(self): """可视化权重矩阵""" plt.imshow(self.W, cmap='coolwarm') plt.colorbar() plt.title("Weight Matrix Visualization") plt.show()

3. 实战演练:字母模式记忆

让我们用三个简单的字母模式来测试这个网络:

# 定义模式(5x5网格表示的字母) def create_pattern(letters): patterns = [] for letter in letters: if letter == 'A': p = [-1,1,1,1,-1, 1,-1,-1,-1,1, 1,1,1,1,1, 1,-1,-1,-1,1, 1,-1,-1,-1,1] elif letter == 'B': p = [1,1,1,1,-1, 1,-1,-1,-1,1, 1,1,1,1,-1, 1,-1,-1,-1,1, 1,1,1,1,-1] elif letter == 'C': p = [-1,1,1,1,1, 1,-1,-1,-1,-1, 1,-1,-1,-1,-1, 1,-1,-1,-1,-1, -1,1,1,1,1] patterns.append(np.array(p)) return patterns # 创建并训练网络 letters = ['A', 'B', 'C'] patterns = create_pattern(letters) dhnn = DiscreteHopfieldNetwork(len(patterns[0])) dhnn.train(patterns) # 可视化权重 dhnn.visualize_weights()

4. 联想测试与能量分析

现在我们来测试网络的联想能力,并观察能量变化:

def test_recall(dhnn, pattern, noise_level=0.3): """添加噪声测试回忆""" noisy = np.copy(pattern) flip_idx = np.random.choice(len(noisy), int(noise_level*len(noisy)), replace=False) noisy[flip_idx] *= -1 # 翻转部分像素 recalled, energy = dhnn.recall(noisy) # 可视化结果 fig, axes = plt.subplots(1, 3, figsize=(12,4)) axes[0].imshow(pattern.reshape(5,5), cmap='binary') axes[0].set_title("Original") axes[1].imshow(noisy.reshape(5,5), cmap='binary') axes[1].set_title(f"Noisy ({noise_level*100}%)") axes[2].imshow(recalled.reshape(5,5), cmap='binary') axes[2].set_title("Recalled") plt.figure() plt.plot(energy) plt.title("Energy Convergence") plt.xlabel("Iterations") plt.ylabel("Energy") plt.show() return recalled # 测试字母A的回忆 test_recall(dhnn, patterns[0])

典型输出会显示:

  1. 原始模式
  2. 添加30%噪声后的损坏模式
  3. 网络回忆恢复的模式
  4. 能量随迭代下降的曲线

5. 性能优化与扩展应用

基础实现可以进一步优化:

并行计算加速

# 使用numpy批量计算加速 def recall_parallel(self, pattern, max_iter=100): state = np.copy(pattern) for _ in range(max_iter): new_state = np.sign(self.W @ state - self.theta) if np.array_equal(new_state, state): break state = new_state return state

应用场景扩展

  • 图像修复:处理部分损坏的图像
  • 模式补全:根据片段信息恢复完整信息
  • 优化问题:将TSP等问题映射到能量函数
# 图像修复示例 def image_denoising(image, noise_ratio=0.2): # 二值化图像并转换为±1 binary = (image > 128).astype(int) pattern = 2*binary.flatten() - 1 # 创建并训练网络 dhnn = DiscreteHopfieldNetwork(len(pattern)) dhnn.train([pattern]) # 添加噪声 noisy = np.copy(pattern) noise_mask = np.random.rand(len(pattern)) < noise_ratio noisy[noise_mask] *= -1 # 恢复图像 cleaned, _ = dhnn.recall(noisy) return (cleaned.reshape(image.shape) + 1) / 2

实际项目中,我发现网络的记忆容量约为0.15N(N是神经元数量)。超过这个限制,网络容易产生虚假记忆。解决方法包括使用伪逆法训练或引入现代改进模型。

http://www.jsqmd.com/news/1137788/

相关文章:

  • YOLOv5 6.1 自定义数据集训练:VOC转YOLO格式脚本优化与3类样本实测
  • Excel下拉列表实战:从数据验证到三级联动与智能搜索
  • Windows Server 2008 R2 虚拟机部署与安全实践指南
  • HEIF Utility终极指南:在Windows上高效转换Apple HEIF图片的完整方案
  • Swap 分区性能调优:swappiness 参数从 0 到 100 的 4 种场景配置
  • JavaScript 事件流实战:从冒泡、捕获到事件委托的 5 个核心案例
  • Android随笔-pipe是什么?
  • 如何彻底告别系统激活烦恼:KMS_VL_ALL_AIO智能激活脚本完全指南
  • 使用Wireshark深度解析PTP协议,精准定位工业网络时间同步故障
  • 微信小程序渲染层网络层错误排查:从 WXSS 图片到视频组件的 3 类常见根因与修复
  • Unity GraphView 与 IMGUI 节点编辑器对比:3 大维度性能与开发效率实测
  • Debian安装Docker最佳实践:官方源、overlay2与docker组权限
  • Tampermonkey 脚本开发实战:10个JS函数实现中国大学MOOC题目一键复制
  • 终极Monaspace编程字体完整指南:如何提升代码可读性与开发效率
  • Solarflare OpenOnload 201811 安装实战:Ubuntu 22.04 系统下 3 步完成驱动与固件升级
  • 多Agent协作:构建分布式智能系统
  • LinuxCNC终极指南:如何从零开始搭建开源数控系统
  • Shell脚本精读 · S09-02 | 管道与管道退出码:`pipefail` 再探
  • Unity 移动平台帧率优化:WebGL 与 Android 120Hz 屏幕的 4 个适配要点
  • UE5 Control Rig 受击响应实战:2个控制器+Fullbody IK 实现8方向动态反馈
  • STM32与EM3080-W构建工业级条形码识别系统
  • 偏微分方程数值解避坑指南:有限差分法3大稳定性条件与误差分析
  • Linux 进程管理进阶:kill -9 与 -15 的3种场景选择与僵尸进程清理
  • Excel电子签名的法律效力与技术实现全解析
  • Android随笔-ThreadLocal
  • Cron Jobs在数据工程中的生产级实践:从定时任务到可靠数据管道
  • 从零部署Gemma大模型:本地化实践与性能优化指南
  • STM32与KMR221构建高精度电压管理系统
  • 告别CPC客户端安装失败:IE与CA证书环境配置终极指南
  • TC78H660FTG与PIC18F46K20构建高效电机驱动系统