使用Python实现神经网络学习,输出使用后4000个样本训练得到模型在测试集上的结果并可视化,参数设置为: batch :300; iters _ num :2000; lamda :0.1
时间: 2023-11-22 11:56:38 浏览: 39
好的,我们可以使用Python中的NumPy库来实现神经网络学习,并使用Matplotlib库进行可视化。
首先,我们需要准备数据集并对其进行预处理。这里我们使用一个简单的手写数字识别数据集,包含训练集和测试集,每张图片大小为28x28像素。我们将每张图片展开成一维向量,并进行归一化处理。
```python
import numpy as np
import matplotlib.pyplot as plt
# 加载数据集
train_data = np.load('train_data.npy')
test_data = np.load('test_data.npy')
# 对数据进行预处理
train_X = train_data[:, :-1] / 255.0
train_y = train_data[:, -1]
test_X = test_data[:, :-1] / 255.0
test_y = test_data[:, -1]
# 将标签转换为独热编码
train_Y = np.zeros((train_y.shape[0], 10))
train_Y[np.arange(train_y.shape[0]), train_y] = 1
test_Y = np.zeros((test_y.shape[0], 10))
test_Y[np.arange(test_y.shape[0]), test_y] = 1
```
接下来,我们定义一个三层神经网络模型,包含一个输入层、一个隐藏层和一个输出层。我们使用交叉熵损失函数和L2正则化,同时使用随机梯度下降算法进行优化。
```python
class NeuralNetwork:
def __init__(self, input_size, hidden_size, output_size, learning_rate, reg_lambda):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.learning_rate = learning_rate
self.reg_lambda = reg_lambda
# 初始化权重
self.W1 = np.random.randn(input_size, hidden_size)
self.b1 = np.zeros((1, hidden_size))
self.W2 = np.random.randn(hidden_size, output_size)
self.b2 = np.zeros((1, 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
exp_scores = np.exp(self.z2)
self.probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
return self.probs
def compute_cost(self, X, y):
# 计算损失函数
num_samples = X.shape[0]
data_loss = -np.sum(y * np.log(self.probs)) / num_samples
reg_loss = 0.5 * self.reg_lambda * (np.sum(np.square(self.W1)) + np.sum(np.square(self.W2)))
return data_loss + reg_loss
def backward(self, X, y):
# 反向传播
delta3 = self.probs - y
dW2 = np.dot(self.a1.T, delta3)
db2 = np.sum(delta3, axis=0, keepdims=True)
delta2 = np.dot(delta3, self.W2.T) * (1 - np.power(self.a1, 2))
dW1 = np.dot(X.T, delta2)
db1 = np.sum(delta2, axis=0)
# 加上L2正则化的梯度
dW2 += self.reg_lambda * self.W2
dW1 += self.reg_lambda * self.W1
# 更新权重和偏置
self.W1 -= self.learning_rate * dW1
self.b1 -= self.learning_rate * db1
self.W2 -= self.learning_rate * dW2
self.b2 -= self.learning_rate * db2
def train(self, X, y, num_iters, batch_size):
# 随机梯度下降算法
for i in range(num_iters):
# 随机选择一个batch的数据进行训练
batch_indices = np.random.choice(X.shape[0], batch_size)
X_batch = X[batch_indices]
y_batch = y[batch_indices]
# 前向传播和反向传播
self.forward(X_batch)
self.backward(X_batch, y_batch)
# 每隔100次迭代输出一次损失函数
if i % 100 == 0:
cost = self.compute_cost(X, y)
print('Iteration %d, cost: %f' % (i, cost))
def predict(self, X):
# 预测结果
probs = self.forward(X)
return np.argmax(probs, axis=1)
```
接下来,我们实例化一个神经网络模型并进行训练。我们使用2000次迭代,每次随机选择300个样本进行训练,并设置L2正则化参数为0.1。
```python
# 实例化神经网络模型并进行训练
nn = NeuralNetwork(input_size=784, hidden_size=50, output_size=10, learning_rate=0.01, reg_lambda=0.1)
nn.train(train_X, train_Y, num_iters=2000, batch_size=300)
```
最后,我们使用测试集评估模型的性能,并可视化模型在测试集上的结果。
```python
# 在测试集上评估模型
test_pred = nn.predict(test_X)
accuracy = np.mean(test_pred == test_y) * 100
print('Test accuracy: %.2f%%' % accuracy)
# 可视化模型在测试集上的结果
fig, axes = plt.subplots(5, 5, figsize=(10, 10))
for i, ax in enumerate(axes.flat):
ax.imshow(test_X[i].reshape((28, 28)), cmap='gray')
ax.set_title('True: %d, Pred: %d' % (test_y[i], test_pred[i]))
ax.axis('off')
plt.show()
```
运行完整的代码后,可以得到模型在测试集上的准确率,并可视化模型在测试集上的预测结果。