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

发布于:2024-10-11 ⋅ 阅读:(134) ⋅ 点赞:(0)

【深度学习基础模型】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 网络,处理部分损坏的图像信息并恢复为完整模式。这为实际应用提供了一个有效的框架。


网站公告

今日签到

点亮在社区的每一天
去签到