离散Hopfield网络(DHNN) 5步Python实现:Hebb规则存储与恢复二值图像
📅 2026/7/6 22:06:17
👁️ 次浏览
离散Hopfield网络(DHNN) 5步Python实现Hebb规则存储与恢复二值图像在人工智能的经典算法中Hopfield神经网络以其独特的联想记忆能力而闻名。本文将带您用Python从零实现一个完整的离散Hopfield网络(DHNN)并展示如何用它存储和恢复二值图像。不同于理论推导我们将聚焦于工程实践通过可视化结果直观理解网络行为。1. 理解Hopfield网络的核心机制Hopfield网络本质上是一个全连接递归神经网络每个神经元都与其他所有神经元相连。它的神奇之处在于能将输入模式存储为网络的记忆并在接收到部分或噪声干扰的输入时通过动态演化恢复出完整的原始记忆。想象你的大脑看到一张被墨水部分遮盖的老照片时仍能辨认出完整图像的能力——这正是Hopfield网络模拟的联想记忆功能。网络通过以下数学特性实现这一功能对称权重矩阵神经元i到j的连接权重等于j到i的权重($w_{ij}w_{ji}$)无自连接对角线权重始终为零($w_{ii}0$)二值状态每个神经元取值为1(激活)或-1(抑制)import numpy as np import matplotlib.pyplot as plt class HopfieldNetwork: def __init__(self, size): self.size size # 神经元数量 self.weights np.zeros((size, size)) # 权重矩阵2. Hebb规则记忆如何被编码Hebbian学习规则是神经科学中的经典理论简言之就是一起激活的神经元会加强连接。在Hopfield网络中我们用它来计算存储模式对应的权重矩阵$$ w_{ij} \sum_{s1}^{n} x_i^s x_j^s \quad (i \neq j) $$其中$x^s$是第s个存储模式。Python实现仅需几行代码def train(self, patterns): 使用Hebb规则训练网络 for p in patterns: p np.reshape(p, (self.size, 1)) self.weights p p.T # 外积求和 np.fill_diagonal(self.weights, 0) # 对角线置零 return self.weights注意实际应用中需要对模式向量进行二值化处理(如将图像像素值转换为±1)3. 网络动态与能量函数Hopfield网络的演化过程可以看作是在能量景观中寻找最低点的过程。能量函数定义为$$ E -\frac{1}{2} \sum_{i,j} w_{ij}x_ix_j $$网络运行时每个神经元根据以下规则异步更新def _update_neuron(self, x, i): 更新单个神经元状态 activation np.dot(self.weights[i,:], x) return 1 if activation 0 else -1 def evolve(self, x, max_iter100): 异步更新网络状态 energy [] for _ in range(max_iter): i np.random.randint(self.size) # 随机选择神经元 x[i] self._update_neuron(x, i) energy.append(self._calculate_energy(x)) if len(energy) 1 and energy[-1] energy[-2]: break # 能量收敛时停止 return x, energy4. 完整实现从图像到记忆让我们用MNIST手写数字数据集演示完整流程。首先准备数据from sklearn.datasets import load_digits def preprocess_image(img, threshold0.5): 将图像二值化为±1 img (img threshold).astype(np.int8) return img * 2 - 1 # 转换到[-1,1] digits load_digits() patterns [preprocess_image(digits.images[i]) for i in [0,1,2]] # 选择3个数字 patterns [p.flatten() for p in patterns] # 展平为向量创建并训练网络hn HopfieldNetwork(patterns[0].shape[0]) hn.train(patterns)测试网络恢复能力def add_noise(pattern, noise_level0.3): 添加随机噪声 flip_mask np.random.random(pattern.shape) noise_level return pattern * (1 - flip_mask) (-pattern) * flip_mask noisy_input add_noise(patterns[0]) recovered, energy hn.evolve(noisy_input.copy())5. 可视化与性能分析通过绘图直观展示网络行为def plot_results(original, noisy, recovered, energy): fig, axes plt.subplots(1, 3, figsize(12,4)) titles [Original, Noisy Input, Recovered] for ax, img, title in zip(axes, [original, noisy, recovered], titles): ax.imshow(img.reshape(8,8), cmapbinary) ax.set_title(title) plt.figure() plt.plot(energy) plt.xlabel(Iterations) plt.ylabel(Energy) plt.title(Energy Convergence) plt.show() plot_results(patterns[0], noisy_input, recovered, energy)典型输出会显示能量函数随迭代单调递减被噪声污染的输入逐渐恢复为原始模式恢复质量与噪声水平和存储模式数量相关参数影响建议值噪声比例过高会导致恢复失败30%存储模式数过多会引起交叉干扰0.15N迭代次数通常快速收敛50-100进阶讨论网络容量与局限虽然Hopfield网络概念优美但实际应用中需注意存储容量有限经验法则是网络能可靠存储约0.15N个模式(N为神经元数量)伪吸引子问题网络可能收敛到非预期的混合状态现代替代方案对于大规模数据深度自编码器通常表现更好然而Hopfield网络仍然是理解联想记忆和能量最小化原理的绝佳教学工具。在最近的研究中其变体如现代Hopfield网络(2020)甚至展现出与Transformer架构的有趣联系。
离散数学函数:从集合论到Python 3.12代码的4种映射关系实现离散数学中的函数概念是计算机科学和算法设计的基石之一。不同于高中数学里简单的"输入输出"关系,离散函数从集合论角度严格定义了映射的规则与特性。对于开发者而言,理解…
📅 2026/7/6 22:06:17
抖音直播数据采集终极指南:3分钟实现弹幕、礼物、用户全量抓取 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2025最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher
想要实时监…
📅 2026/7/6 22:06:17
Unity 2022.3 LTS 帧率控制实战:Application.targetFrameRate 与 VSync 的 3 种组合效果深度解析在Unity游戏开发中,帧率控制是优化性能和用户体验的关键环节。许多开发者在使用Application.targetFrameRate时都遇到过这样的困惑:明明代码中设…
📅 2026/7/6 22:06:17
1. 项目概述:为什么一张“Coding Plan”价格表值得花2000字拆解?国内开发者圈最近半年聊得最多的一个词,不是大模型API调用成本,也不是云主机降价,而是“Coding Plan”——这个由国内头部代码托管平台推出的、面向个人…
📅 2026/7/6 23:12:35
AD 24 PCB设计规则深度解析:从10mil默认间距到6层板内层差分对管理在高速数字电路与混合信号PCB设计中,规则配置的精确性直接决定产品可靠性。Altium Designer 24的规则引擎经过全面升级,支持从基础间距约束到复杂层叠管理的全流程控制。本文…
📅 2026/7/6 23:12:35
1. 项目概述:为什么接口测试是研发流程的“咽喉要道”刚入行那会儿,我对接口测试的理解还停留在“用Postman发个请求,看看返回对不对”的层面。直到有一次,一个看似简单的用户登录功能上线后,直接导致整个移动端App在高…
📅 2026/7/6 23:12:35
1. EM3080-W图像传感器深度解析在工业级条形码识别领域,EM3080-W是一款被广泛采用的CMOS图像传感器。这款传感器最显著的特点是内置了完整的模拟前端处理电路,能够直接将光信号转换为数字信号输出。我在多个自动化仓储项目中实测发现,其30cm的…
📅 2026/7/6 23:12:35
Linux 文件系统与磁盘分区实战指南:ext4/XFS/Btrfs 性能对比与分区工具选型在当今数据驱动的时代,高效可靠的存储管理已成为系统管理员和DevOps工程师的核心竞争力。面对NVMe SSD等高性能存储设备的普及,如何选择合适的文件系统和分区工具组合…
📅 2026/7/6 23:12:35
1. PCF8591与PIC18LF46K22的信号转换系统概述在嵌入式系统开发中,模拟信号与数字信号的相互转换是常见需求。PCF8591作为一款集成了ADC和DAC功能的芯片,配合PIC18LF46K22这款高性能微控制器,可以构建一个灵活的信号处理系统。这个组合特别适合…
📅 2026/7/6 23:10:34
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray
你是否厌倦了Windows任务栏上密密麻麻的图标&…
📅 2026/7/6 0:01:19
1. 项目概述:一次对React Server Components核心安全机制的深度剖析 最近在安全研究圈里,CVE-2025-55182这个编号被频繁提及,它直指React生态中一个相对较新的概念——React Server Components(RSC)。作为一个长期关注…
📅 2026/7/6 0:01:20
星露谷物语终极MOD指南:5个步骤打造智能自动化农场 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods
你是否厌倦了在星露谷物语中重复收割、加工、存储的繁琐操作?梦…
📅 2026/7/6 0:01:20
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/6 10:35:30
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/6 6:10:21
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/6 5:35:58
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/6 6:10:28
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/6 6:10:26
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/5 23:45:08