请用Python写一段有三个输入单元,六个中间单元,一个输出单元的三层BP神经网络的代码
时间: 2023-02-20 19:27:58 浏览: 99
import numpy as np
# 输入层
X = np.array([[1, 0, 1], [0, 1, 0], [1, 1, 1], [0, 0, 0]])
# 输出层
y = np.array([[0, 1, 1, 0]]).T
# 初始化权重
w1 = np.random.random((3, 6))
w2 = np.random.random((6, 1))
# 学习率
learning_rate = 0.1
# 前向传播
for epoch in range(1000):
# 计算第一层
z1 = np.dot(X, w1)
a1 = np.tanh(z1)
# 计算第二层
z2 = np.dot(a1, w2)
a2 = np.tanh(z2)
# 计算损失函数
loss = np.mean((a2 - y) ** 2)
# 反向传播
dz2 = (a2 - y) * (1 - np.tanh(z2) ** 2)
dw2 = np.dot(a1.T, dz2)
dz1 = np.dot(dz2, w2.T) * (1 - np.tanh(z1) ** 2)
dw1 = np.dot(X.T, dz1)
# 更新权重
w1 -= learning_rate * dw1
w2 -= learning_rate * dw2
# 输出结果
print(a2)
相关问题
bp神经网络python
在Python中实现BP神经网络需要使用一些库,比如numpy、pandas等。下面是一个简单的示例代码,演示了如何使用Python实现BP神经网络。
首先,需要导入所需的库:
```
import numpy as np
import pandas as pd
```
然后,定义BP神经网络的类:
```
class BPNeuralNetwork:
def __init__(self, input_size, hidden_size, output_size):
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.weights_ih = np.random.rand(self.hidden_size, self.input_size)
self.bias_h = np.random.rand(self.hidden_size, 1)
self.weights_ho = np.random.rand(self.output_size, self.hidden_size)
self.bias_o = np.random.rand(self.output_size, 1)
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
def feedforward(self, inputs):
inputs = np.array(inputs, ndmin=2).T
hidden_inputs = np.dot(self.weights_ih, inputs) + self.bias_h
hidden_outputs = self.sigmoid(hidden_inputs)
output_inputs = np.dot(self.weights_ho, hidden_outputs) + self.bias_o
output_outputs = self.sigmoid(output_inputs)
return output_outputs
def train(self, inputs, targets, learning_rate):
inputs = np.array(inputs, ndmin=2).T
targets = np.array(targets, ndmin=2).T
hidden_inputs = np.dot(self.weights_ih, inputs) + self.bias_h
hidden_outputs = self.sigmoid(hidden_inputs)
output_inputs = np.dot(self.weights_ho, hidden_outputs) + self.bias_o
output_outputs = self.sigmoid(output_inputs)
output_errors = targets - output_outputs
hidden_errors = np.dot(self.weights_ho.T, output_errors)
self.weights_ho += learning_rate * np.dot(output_errors * output_outputs * (1 - output_outputs), hidden_outputs.T)
self.bias_o += learning_rate * output_errors * output_outputs * (1 - output_outputs)
self.weights_ih += learning_rate * np.dot(hidden_errors * hidden_outputs * (1 - hidden_outputs), inputs.T)
self.bias_h += learning_rate * hidden_errors * hidden_outputs * (1 - hidden_outputs)
```
这个类包括了神经网络的初始化方法、sigmoid激活函数、前向传播方法和训练方法。
接下来,可以使用这个类来创建一个BP神经网络,并训练它:
```
nn = BPNeuralNetwork(2, 3, 1)
inputs = [[0, 0], [0, 1], [1, 0], [1, 1]]
targets = [[0], [1], [1], [0]]
for i in range(10000):
for j in range(len(inputs)):
nn.train(inputs[j], targets[j], 0.1)
```
这段代码创建了一个输入层有两个节点、隐藏层有三个节点、输出层有一个节点的神经网络,并使用逐个样本的方式进行训练。经过10000次训练,这个神经网络应该能够正确地输出异或运算的结果。
以上就是一个简单的BP神经网络的Python实现。当然,实际应用中可能需要对代码进行进一步的优化和修改,以适应不同的场景和任务。
编写python代码,实验时建立三层BP神经网络,输入节点2个,隐含层节点2个,输出节点1个,输入训练样本如下表: 输入值0.0 0.1 0.0 1.0 1.0 0.0 1.0 1.0 0.1 1.0 输出值 0.0 1.0 1.0 0.0 1.0学习率分别为0.8, 最大允许误差0.001。求出迭代次数和训练耗时。 2、在原来网络的基础上,改变学习因子为0.5,求出迭代次数和训练耗时并进行对比。 3、改变输入层、隐含层、输出层的单元数。在原来网络的基础上,当隐含层节点个数为3时,求出迭代次数和训练耗时并进行对比。 4、在原来网络的基础上,取误差为0.0001,求出迭代次数和训练耗时并进行对比。
以下是实现上述任务的Python代码:
```python
import numpy as np
import time
# 定义 sigmoid 函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义 sigmoid 的导数函数
def sigmoid_derivative(x):
return x * (1 - x)
# 设置训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 设置超参数
learning_rate = 0.8
max_error = 0.001
max_iterations = 10000
# 初始化权重和偏置
np.random.seed(1)
w1 = 2 * np.random.random((2, 2)) - 1
b1 = 2 * np.random.random((1, 2)) - 1
w2 = 2 * np.random.random((2, 1)) - 1
b2 = 2 * np.random.random((1, 1)) - 1
# 训练模型
start_time = time.time()
for i in range(max_iterations):
# 前向传播
layer1 = sigmoid(np.dot(X, w1) + b1)
layer2 = sigmoid(np.dot(layer1, w2) + b2)
# 计算误差
error = y - layer2
if np.mean(np.abs(error)) < max_error:
print(f"Reached max accuracy at iteration {i+1}")
break
# 反向传播
layer2_delta = error * sigmoid_derivative(layer2)
layer1_delta = layer2_delta.dot(w2.T) * sigmoid_derivative(layer1)
# 更新权重和偏置
w2 += layer1.T.dot(layer2_delta) * learning_rate
b2 += np.sum(layer2_delta, axis=0, keepdims=True) * learning_rate
w1 += X.T.dot(layer1_delta) * learning_rate
b1 += np.sum(layer1_delta, axis=0, keepdims=True) * learning_rate
end_time = time.time()
print(f"Training time: {end_time - start_time:.2f} seconds")
# 测试模型
print(layer2)
# 改变学习因子为 0.5
learning_rate = 0.5
max_iterations = 10000
# 重新训练模型
np.random.seed(1)
w1 = 2 * np.random.random((2, 2)) - 1
b1 = 2 * np.random.random((1, 2)) - 1
w2 = 2 * np.random.random((2, 1)) - 1
b2 = 2 * np.random.random((1, 1)) - 1
start_time = time.time()
for i in range(max_iterations):
# 前向传播
layer1 = sigmoid(np.dot(X, w1) + b1)
layer2 = sigmoid(np.dot(layer1, w2) + b2)
# 计算误差
error = y - layer2
if np.mean(np.abs(error)) < max_error:
print(f"Reached max accuracy at iteration {i+1}")
break
# 反向传播
layer2_delta = error * sigmoid_derivative(layer2)
layer1_delta = layer2_delta.dot(w2.T) * sigmoid_derivative(layer1)
# 更新权重和偏置
w2 += layer1.T.dot(layer2_delta) * learning_rate
b2 += np.sum(layer2_delta, axis=0, keepdims=True) * learning_rate
w1 += X.T.dot(layer1_delta) * learning_rate
b1 += np.sum(layer1_delta, axis=0, keepdims=True) * learning_rate
end_time = time.time()
print(f"Training time: {end_time - start_time:.2f} seconds")
# 测试模型
print(layer2)
# 改变隐含层节点数为 3
learning_rate = 0.8
num_hidden_units = 3
max_iterations = 10000
# 重新训练模型
np.random.seed(1)
w1 = 2 * np.random.random((2, num_hidden_units)) - 1
b1 = 2 * np.random.random((1, num_hidden_units)) - 1
w2 = 2 * np.random.random((num_hidden_units, 1)) - 1
b2 = 2 * np.random.random((1, 1)) - 1
start_time = time.time()
for i in range(max_iterations):
# 前向传播
layer1 = sigmoid(np.dot(X, w1) + b1)
layer2 = sigmoid(np.dot(layer1, w2) + b2)
# 计算误差
error = y - layer2
if np.mean(np.abs(error)) < max_error:
print(f"Reached max accuracy at iteration {i+1}")
break
# 反向传播
layer2_delta = error * sigmoid_derivative(layer2)
layer1_delta = layer2_delta.dot(w2.T) * sigmoid_derivative(layer1)
# 更新权重和偏置
w2 += layer1.T.dot(layer2_delta) * learning_rate
b2 += np.sum(layer2_delta, axis=0, keepdims=True) * learning_rate
w1 += X.T.dot(layer1_delta) * learning_rate
b1 += np.sum(layer1_delta, axis=0, keepdims=True) * learning_rate
end_time = time.time()
print(f"Training time: {end_time - start_time:.2f} seconds")
# 测试模型
print(layer2)
# 将误差阈值改为 0.0001
learning_rate = 0.8
max_error = 0.0001
max_iterations = 100000
# 重新训练模型
np.random.seed(1)
w1 = 2 * np.random.random((2, 2)) - 1
b1 = 2 * np.random.random((1, 2)) - 1
w2 = 2 * np.random.random((2, 1)) - 1
b2 = 2 * np.random.random((1, 1)) - 1
start_time = time.time()
for i in range(max_iterations):
# 前向传播
layer1 = sigmoid(np.dot(X, w1) + b1)
layer2 = sigmoid(np.dot(layer1, w2) + b2)
# 计算误差
error = y - layer2
if np.mean(np.abs(error)) < max_error:
print(f"Reached max accuracy at iteration {i+1}")
break
# 反向传播
layer2_delta = error * sigmoid_derivative(layer2)
layer1_delta = layer2_delta.dot(w2.T) * sigmoid_derivative(layer1)
# 更新权重和偏置
w2 += layer1.T.dot(layer2_delta) * learning_rate
b2 += np.sum(layer2_delta, axis=0, keepdims=True) * learning_rate
w1 += X.T.dot(layer1_delta) * learning_rate
b1 += np.sum(layer1_delta, axis=0, keepdims=True) * learning_rate
end_time = time.time()
print(f"Training time: {end_time - start_time:.2f} seconds")
# 测试模型
print(layer2)
```
第一段代码将建立一个三层BP神经网络,并使用给定的训练数据进行训练。在训练过程中,我们将监控误差是否小于给定的阈值,并在达到该阈值或达到最大迭代次数时停止训练。训练完成后,我们将输出网络的输出结果并计算训练耗时。
第二段代码将使用与第一段代码相同的训练数据和网络结构,但将学习率设置为0.5,并重新进行训练。我们将输出网络的输出结果并计算训练耗时。
第三段代码将使用与第一段代码相同的训练数据和学习率,但将隐含层节点数改为3,并重新进行训练。我们将输出网络的输出结果并计算训练耗时。
第四段代码将使用与第一段代码相同的训练数据和网络结构,但将误差阈值设置为0.0001,并重新进行训练。我们将输出网络的输出结果并计算训练耗时。
阅读全文