用Python写一个三层神经网络
时间: 2023-07-08 13:12:03 浏览: 80
利用Python实现三层BP神经网络
5星 · 资源好评率100%
好的,以下是一个简单的三层神经网络的 Python 代码:
```python
import numpy as np
# 输入层有 2 个节点,隐藏层有 3 个节点,输出层有 1 个节点
input_layer_size = 2
hidden_layer_size = 3
output_layer_size = 1
# 初始化权重矩阵
theta1 = np.random.rand(hidden_layer_size, input_layer_size+1) # 输入层到隐藏层的权重
theta2 = np.random.rand(output_layer_size, hidden_layer_size+1) # 隐藏层到输出层的权重
# 定义 sigmoid 函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 前向传播函数
def forward_propagation(X, theta1, theta2):
m = X.shape[0] # 样本数
a1 = np.hstack([np.ones([m, 1]), X]) # 在 X 前面加一列全是 1 的列向量,作为输入层的偏置项
z2 = np.dot(a1, theta1.T) # 第一层神经元的带权输入,即输入层到隐藏层的加权和
a2 = np.hstack([np.ones([m, 1]), sigmoid(z2)]) # 第一层神经元的输出,作为隐藏层的偏置项,再加上全是 1 的列向量,作为隐藏层的偏置项
z3 = np.dot(a2, theta2.T) # 输出层的带权输入,即隐藏层到输出层的加权和
h = sigmoid(z3) # 网络的输出
return a1, z2, a2, z3, h
# 反向传播函数
def backward_propagation(X, y, theta1, theta2, learning_rate=0.1):
m = X.shape[0] # 样本数
a1, z2, a2, z3, h = forward_propagation(X, theta1, theta2) # 前向传播
delta3 = h - y # 输出层的误差
delta2 = np.dot(delta3, theta2) * sigmoid(z2) * (1 - sigmoid(z2)) # 隐藏层的误差
delta2 = delta2[:,1:] # 去掉偏置项的误差
grad1 = np.dot(delta2.T, a1) / m # 输入层到隐藏层的梯度
grad2 = np.dot(delta3.T, a2) / m # 隐藏层到输出层的梯度
theta1 -= learning_rate * grad1 # 更新输入层到隐藏层的权重
theta2 -= learning_rate * grad2 # 更新隐藏层到输出层的权重
return theta1, theta2
# 训练函数
def train(X, y, theta1, theta2, num_iters=10000):
for i in range(num_iters):
theta1, theta2 = backward_propagation(X, y, theta1, theta2)
return theta1, theta2
# 生成训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 训练神经网络
theta1, theta2 = train(X, y, theta1, theta2)
# 预测结果
a1, z2, a2, z3, h = forward_propagation(X, theta1, theta2)
print(h)
```
这个三层神经网络使用 sigmoid 函数作为激活函数,采用随机初始化权重矩阵的方法来训练网络,并使用反向传播算法来计算梯度和更新权重矩阵。最后,我们用生成的训练数据进行训练,并用训练好的网络来预测结果。
阅读全文