【深度学习基础模型】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



参考地址: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 网络,处理部分损坏的图像信息并恢复为完整模式。这为实际应用提供了一个有效的框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值