手写数字识别隐藏层构建的主要代码
时间: 2023-09-15 14:23:17 浏览: 47
以下是手写数字识别的隐藏层构建的主要代码:
```python
import numpy as np
class NeuralNetwork:
def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate):
self.input_nodes = input_nodes
self.hidden_nodes = hidden_nodes
self.output_nodes = output_nodes
self.lr = learning_rate
# 初始化权重,使用正态分布中心化的随机数
self.weights_input_hidden = np.random.normal(0.0, self.hidden_nodes**-0.5, (self.hidden_nodes, self.input_nodes))
self.weights_hidden_output = np.random.normal(0.0, self.output_nodes**-0.5, (self.output_nodes, self.hidden_nodes))
# 初始化偏差
self.bias_hidden = np.zeros((self.hidden_nodes, 1))
self.bias_output = np.zeros((self.output_nodes, 1))
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def forward_pass(self, inputs):
# 计算隐藏层的输入
hidden_inputs = np.dot(self.weights_input_hidden, inputs) + self.bias_hidden
# 计算隐藏层的输出
hidden_outputs = self.sigmoid(hidden_inputs)
# 计算输出层的输入
final_inputs = np.dot(self.weights_hidden_output, hidden_outputs) + self.bias_output
# 计算输出层的输出
final_outputs = final_inputs
return final_outputs, hidden_outputs
def backward_pass(self, inputs, targets, final_outputs, hidden_outputs):
# 计算输出层的误差
output_errors = targets - final_outputs
# 计算隐藏层的误差
hidden_errors = np.dot(self.weights_hidden_output.T, output_errors) * hidden_outputs * (1 - hidden_outputs)
# 更新输出层的权重和偏差
self.weights_hidden_output += self.lr * np.dot(output_errors, hidden_outputs.T)
self.bias_output += self.lr * output_errors
# 更新隐藏层的权重和偏差
self.weights_input_hidden += self.lr * np.dot(hidden_errors, inputs.T)
self.bias_hidden += self.lr * hidden_errors
def train(self, inputs, targets):
final_outputs, hidden_outputs = self.forward_pass(inputs)
self.backward_pass(inputs, targets, final_outputs, hidden_outputs)
```
这段代码实现了一个包含一个隐层的神经网络,它使用 sigmoid 激活函数和反向传播算法进行训练。其中,`weights_input_hidden` 和 `weights_hidden_output` 是输入层到隐层和隐层到输出层的权重矩阵,`bias_hidden` 和 `bias_output` 是隐层和输出层的偏差向量,`sigmoid` 函数是激活函数,`forward_pass` 函数实现了前向传播,`backward_pass` 函数实现了反向传播,`train` 函数用于训练网络。