神经网络非线性模型输出特征权重并描绘特征权重图的python代码
以下是一个简单的神经网络非线性模型输出特征权重并绘制特征权重图的Python代码示例:
import numpy as np
import matplotlib.pyplot as plt
# 定义神经网络模型
class NeuralNetwork:
def __init__(self):
# 定义模型参数
self.input_size = 10
self.hidden_size = 5
self.output_size = 1
self.learning_rate = 0.1
# 初始化权重和偏置
self.W1 = np.random.randn(self.input_size, self.hidden_size)
self.b1 = np.zeros((1, self.hidden_size))
self.W2 = np.random.randn(self.hidden_size, self.output_size)
self.b2 = np.zeros((1, self.output_size))
# 定义前向传播函数
def forward(self, X):
self.z1 = np.dot(X, self.W1) + self.b1
self.a1 = np.tanh(self.z1)
self.z2 = np.dot(self.a1, self.W2) + self.b2
self.y_hat = np.sigmoid(self.z2)
return self.y_hat
# 定义反向传播函数
def backward(self, X, y):
self.error = y - self.y_hat
self.delta2 = self.error * self.y_hat * (1 - self.y_hat)
self.dW2 = np.dot(self.a1.T, self.delta2)
self.db2 = np.sum(self.delta2, axis=0, keepdims=True)
self.delta1 = np.dot(self.delta2, self.W2.T) * (1 - np.power(self.a1, 2))
self.dW1 = np.dot(X.T, self.delta1)
self.db1 = np.sum(self.delta1, axis=0)
# 定义模型训练函数
def train(self, X, y, epochs):
self.losses = []
for i in range(epochs):
y_hat = self.forward(X)
self.backward(X, y)
self.W2 += self.learning_rate * self.dW2
self.b2 += self.learning_rate * self.db2
self.W1 += self.learning_rate * self.dW1
self.b1 += self.learning_rate * self.db1
loss = np.mean(np.square(y - y_hat))
self.losses.append(loss)
if i % 100 == 0:
print(f"Epoch {i}, Loss: {loss:.4f}")
# 定义特征权重图绘制函数
def plot_weights(self):
fig, ax = plt.subplots(figsize=(10, 6))
im = ax.imshow(self.W1, cmap='coolwarm', vmin=-1, vmax=1)
ax.set_xticks(np.arange(self.hidden_size))
ax.set_yticks(np.arange(self.input_size))
ax.set_xticklabels(np.arange(1, self.hidden_size+1))
ax.set_yticklabels(np.arange(1, self.input_size+1))
ax.set_xlabel('Hidden Units')
ax.set_ylabel('Input Features')
ax.set_title('Feature Weights')
fig.colorbar(im)
plt.show()
# 生成随机数据
X = np.random.randn(1000, 10)
y = np.random.randint(0, 2, (1000, 1))
# 创建神经网络模型实例
model = NeuralNetwork()
# 训练模型
model.train(X, y, epochs=1000)
# 绘制特征权重图
model.plot_weights()
以上代码中,我们定义了一个包含一个隐藏层和一个输出层的神经网络模型。在训练模型时,我们记录了每个epoch的损失,并在每100个epoch后输出损失值。在模型训练完成后,我们调用plot_weights()函数绘制特征权重图。这个函数使用matplotlib库绘制热力图,其中每个格子的颜色表示相应特征和隐藏单元之间的权重值
原文地址: http://www.cveoy.top/t/topic/hsr9 著作权归作者所有。请勿转载和采集!