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

【深度学习基础模型】Hopfield 网络 (HN) 详细理解并附实现代码。

【深度学习基础模型】Hopfield 网络 (HN) ——Neural networks and physical systems with emergent collective computational abilities

【深度学习基础模型】Hopfield 网络 (HN) ——Neural networks and physical systems with emergent collective computational abilities


文章目录

  • 【深度学习基础模型】Hopfield 网络 (HN) ——Neural networks and physical systems with emergent collective computational abilities
  • 1. Hopfield 网络 (HN) 的原理与应用
    • 1.1 Hopfield 网络原理
    • 1.2 应用领域
  • 2. Python 代码实现 Hopfield 网络在遥感图像中的应用实例
    • 2.1 Hopfield 网络的实现
    • 2.2 代码解释
  • 3. 总结


参考地址:https://www.asimovinstitute.org/neural-network-zoo/
论文地址:https://www.pnas.org/doi/epdf/10.1073/pnas.79.8.2554

欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!

1. Hopfield 网络 (HN) 的原理与应用

1.1 Hopfield 网络原理

Hopfield 网络是一种递归神经网络,其中每个神经元与其他神经元完全连接,形成一个高度耦合的网络。该网络主要用于模式识别和记忆,具有以下关键特征:

  • 全连接:每个神经元与所有其他神经元都有连接。
  • 模式记忆:通过训练网络以存储和回忆多个模式。
  • 能量函数:网络状态的稳定性与其能量有关,网络会向最低能量状态(记忆模式)收敛。
  • 激活阈值:每个神经元在接收到输入时,会根据输入的总和决定激活状态(通常为-1或1)。
  • 异步更新:神经元可以逐个更新,通过随机选择更新顺序以避免同步更新带来的不稳定性。

1.2 应用领域

  • 模式识别:用于图像识别、语音识别等。
  • 记忆存储:可以存储和回忆多个模式。
  • 图像修复:通过部分输入重构完整图像。

在遥感领域,Hopfield 网络可以用于从受损或噪声的图像中恢复信息,进行模式识别等任务。

2. Python 代码实现 Hopfield 网络在遥感图像中的应用实例

以下是一个简单的 Hopfield 网络实现示例,展示如何在遥感图像修复任务中应用 Hopfield 网络。

2.1 Hopfield 网络的实现

import numpy as np
import matplotlib.pyplot as plt

class HopfieldNetwork:
    def __init__(self, num_neurons):
        self.num_neurons = num_neurons
        self.weights = np.zeros((num_neurons, num_neurons))
        
    def train(self, patterns):
        for p in patterns:
            self.weights += np.outer(p, p)
        # 确保对角线为0
        np.fill_diagonal(self.weights, 0)
        
    def update(self, state):
        for i in range(self.num_neurons):
            activation = np.dot(self.weights[i], state)
            state[i] = 1 if activation > 0 else -1  # 二值化输出
        return state
    
    def run(self, initial_state, max_iterations=10):
        state = initial_state.copy()
        for _ in range(max_iterations):
            new_state = self.update(state)
            if np.array_equal(new_state, state):  # 检查是否收敛
                break
            state = new_state
        return state

# 2. 创建并训练 Hopfield 网络
# 定义一些二进制模式
pattern1 = np.array([1, 1, -1, -1])
pattern2 = np.array([1, -1, -1, 1])
patterns = [pattern1, pattern2]

# 实例化 Hopfield 网络
hn = HopfieldNetwork(num_neurons=len(pattern1))
hn.train(patterns)

# 3. 测试网络
# 创建一个带噪声的输入模式(故意添加一些噪声)
test_input = np.array([1, 1, -1, 1])  # 期望恢复到 pattern1
print("Test Input:", test_input)

# 运行 Hopfield 网络
output = hn.run(test_input)
print("Recovered Output:", output)

# 4. 可视化结果
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.title("Test Input")
plt.bar(range(len(test_input)), test_input)
plt.xticks(range(len(test_input)), ['Neuron 1', 'Neuron 2', 'Neuron 3', 'Neuron 4'])

plt.subplot(1, 2, 2)
plt.title("Recovered Output")
plt.bar(range(len(output)), output)
plt.xticks(range(len(output)), ['Neuron 1', 'Neuron 2', 'Neuron 3', 'Neuron 4'])

plt.tight_layout()
plt.show()

2.2 代码解释

  1. 定义 Hopfield 网络类:
class HopfieldNetwork:
    def __init__(self, num_neurons):
        self.num_neurons = num_neurons
        self.weights = np.zeros((num_neurons, num_neurons))
  • 初始化 Hopfield 网络,包括神经元数量和权重矩阵(初始化为零矩阵)。
  1. 训练网络:
def train(self, patterns):
    for p in patterns:
        self.weights += np.outer(p, p)
    np.fill_diagonal(self.weights, 0)
  • 对于每个训练模式,更新权重矩阵,使用外积来计算权重,并确保对角线元素为零(无自连接)。
  1. 更新网络状态:
def update(self, state):
    for i in range(self.num_neurons):
        activation = np.dot(self.weights[i], state)
        state[i] = 1 if activation > 0 else -1
    return state
  • 遍历每个神经元,计算激活值并更新状态为-1或1。
  1. 运行网络:
def run(self, initial_state, max_iterations=10):
    state = initial_state.copy()
    for _ in range(max_iterations):
        new_state = self.update(state)
        if np.array_equal(new_state, state):
            break
        state = new_state
    return state
  • 运行 Hopfield 网络,直到收敛或达到最大迭代次数。
  1. 训练和测试网络:
pattern1 = np.array([1, 1, -1, -1])
pattern2 = np.array([1, -1, -1, 1])
patterns = [pattern1, pattern2]

hn = HopfieldNetwork(num_neurons=len(pattern1))
hn.train(patterns)

test_input = np.array([1, 1, -1, 1])
print("Test Input:", test_input)

output = hn.run(test_input)
print("Recovered Output:", output)
  • 创建两个训练模式,并用噪声输入测试网络。输出恢复的模式。
  1. 可视化输入和输出:
plt.figure(figsize=(8, 4))
plt.subplot(1, 2, 1)
plt.title("Test Input")
plt.bar(range(len(test_input)), test_input)
plt.xticks(range(len(test_input)), ['Neuron 1', 'Neuron 2', 'Neuron 3', 'Neuron 4'])

plt.subplot(1, 2, 2)
plt.title("Recovered Output")
plt.bar(range(len(output)), output)
plt.xticks(range(len(output)), ['Neuron 1', 'Neuron 2', 'Neuron 3', 'Neuron 4'])

plt.tight_layout()
plt.show()
  • 使用 Matplotlib 可视化测试输入和恢复的输出。

3. 总结

Hopfield 网络是一种强大的模型,能够存储和恢复模式,在遥感图像处理、模式识别等领域具有广泛应用。通过 Python 实现的示例展示了如何训练和运行 Hopfield 网络,处理部分损坏的图像信息并恢复为完整模式。这为实际应用提供了一个有效的框架。


http://www.kler.cn/news/326460.html

相关文章:

  • 【RabbitMQ】RabbitMq消息丢失、重复消费以及消费顺序性的解决方案
  • C#知识|设计模式的分类及认识
  • 从0学习React(1)
  • Goweb---Gorm操作数据库(三) 更新
  • 数学建模研赛总结
  • 【动态规划-分组背包】力扣1155. 掷骰子等于目标和的方法数
  • 并发编程三大特性(原子性、可见性、有序性)
  • 每日一题:⻓度最⼩的⼦数组
  • 计算机毕业设计 Java教务管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • python魔法(python高级magic方法进阶)
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十五章 Linux 文件系统概念
  • 基于大数据的二手电子产品需求分析及可视化系统
  • open-resty 服务安装kafka插件
  • 深入理解EVM(以太坊虚拟机)及其工作原理,因为这将直接影响智能合约的开发。
  • 智融-SW6003 双向移动电源IC
  • P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解
  • idea使用技巧与插件推荐
  • 序列化方式五——ProtoStuff
  • JSON 教程
  • 什么Python库处理大量数据比较快?
  • Oracle 性能优化的高频面试题及答案
  • MySQL和Doris开窗函数LAG执行时的区别
  • PHP入门必看:从基础语法到实际应用,一文掌握Web开发的必备技能!
  • X-Spreadsheet:Web端Excel电子表格工具库
  • “AI+Security”系列第3期(五):AI技术在网络安全领域的本地化应用与挑战
  • 使用 Colly 在 Golang 中进行网页抓取的步骤
  • Rust Web自动化Demo
  • 《动手学深度学习》笔记2.4——神经网络从基础→进阶 (文件读写-保存参数和模型)
  • 堆的数组实现
  • nginx的安装和使用