零基础入门深度学习:用numpy实现神经网络训练

作者:问题终结者2024.02.18 12:43浏览量:6

简介:本文将通过使用numpy库,带领读者从零开始实现一个简单的神经网络,并对其进行训练。我们将使用手写数字识别数据集,以便在实际应用中体验深度学习的魅力。

深度学习领域,神经网络是最为核心的技术之一。而要实现神经网络,我们需要用到一些数学和编程知识。本系列文章将带领大家从零开始,逐步深入到神经网络的实现和应用。在本文中,我们将使用Python的numpy库来实现一个简单的神经网络,并进行训练。

首先,我们需要安装numpy库。如果你还没有安装,可以使用以下命令进行安装:

  1. pip install numpy

接下来,我们将使用手写数字识别数据集来进行神经网络的训练。数据集包含了0到9的手写数字图像和对应的标签,我们将使用这些图像和标签来训练我们的神经网络。

首先,我们需要导入所需的库和模块,包括numpy、matplotlib和sklearn等。同时,我们还需要导入手写数字识别数据集。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn import datasets

接下来,我们将加载手写数字识别数据集,并将其分成训练集和测试集。我们将使用80%的数据作为训练集,20%的数据作为测试集。

  1. digits = datasets.load_digits()
  2. X = digits.data
  3. y = digits.target
  4. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

接下来,我们将定义一个简单的神经网络模型。我们将使用numpy来实现这个模型,包括输入层、隐藏层和输出层。输入层有64个节点,隐藏层有32个节点,输出层有10个节点(对应于0到9的手写数字)。我们将使用ReLU激活函数进行非线性变换。

  1. class SimpleNeuralNetwork:
  2. def __init__(self, input_size, hidden_size, output_size):
  3. self.W1 = np.random.randn(input_size, hidden_size) * 0.01
  4. self.b1 = np.zeros((1, hidden_size))
  5. self.W2 = np.random.randn(hidden_size, output_size) * 0.01
  6. self.b2 = np.zeros((1, output_size))
  7. self.lr = 0.01

接下来,我们将定义前向传播函数和反向传播函数,以便在训练过程中更新神经网络的权重和偏置项。在前向传播函数中,我们将输入数据通过隐藏层和输出层进行计算,得到预测结果。在反向传播函数中,我们将计算预测结果与真实标签之间的误差,并使用梯度下降算法更新权重和偏置项。

在前向传播函数中,我们将使用ReLU激活函数对输入数据进行非线性变换,然后将其传递给输出层进行线性变换。具体实现如下:

  1. def forward(self, X):
  2. self.hidden = np.maximum(0, X @ self.W1 + self.b1) # ReLU activation function
  3. self.output = self.hidden @ self.W2 + self.b2 # Linear activation function in the output layer
  4. return self.output

在反向传播函数中,我们将计算预测结果与真实标签之间的误差,并使用梯度下降算法更新权重和偏置项。具体实现如下:

```python
def backward(self, X, y, output):
m = X.shape[1] # number of training examples
outputdelta = (output - y) / m # error gradient for the output layer (chain rule)
hidden_error = np.dot(output_delta, self.W2.T) # error gradient for the hidden layer (chain rule)
hidden_delta = hidden_error (self.hidden > 0) # backpropagation through ReLU activation function (chain rule)
self.W2 += np.dot(self.hidden.T, output_delta)
m # update weights (gradient ascent) for output layer (chain rule)
self.b2 += np.sum(output_delta, axis=1, keepdims=True) # update bias for output layer (gradient ascent) (chain rule)
self.W1 += np.dot(X.T, hidden