【深度学习基础模型】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 代码解释
- 定义 Hopfield 网络类:
class HopfieldNetwork:
def __init__(self, num_neurons):
self.num_neurons = num_neurons
self.weights = np.zeros((num_neurons, num_neurons))
- 初始化 Hopfield 网络,包括神经元数量和权重矩阵(初始化为零矩阵)。
- 训练网络:
def train(self, patterns):
for p in patterns:
self.weights += np.outer(p, p)
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
- 遍历每个神经元,计算激活值并更新状态为-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 网络,直到收敛或达到最大迭代次数。
- 训练和测试网络:
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)
- 创建两个训练模式,并用噪声输入测试网络。输出恢复的模式。
- 可视化输入和输出:
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 网络,处理部分损坏的图像信息并恢复为完整模式。这为实际应用提供了一个有效的框架。