用python3.9,搭建一个有输入层、隐含层、输出层三层的BP神经网络,隐含层设置4个节点并且激励函数使用tanh函数,输出层激励函数使用sigmoid函数,权重节点之间的权重初始值随机生成接着采用梯度下降法寻优,输入的训练样本为3个类别的三维坐标点,每个类别10个样本点,训练100轮,每一轮打印误差和权重
时间: 2024-02-22 16:56:29 浏览: 104
好的,这是一个比较复杂的问题,需要一步一步来实现。首先需要导入所需的库:numpy、random。
```python
import numpy as np
import random
```
接着,我们需要定义神经网络的结构,即输入层、隐含层、输出层的节点数。根据题目要求,输入层有3个节点,隐含层有4个节点,输出层有1个节点。
```python
input_nodes = 3
hidden_nodes = 4
output_nodes = 1
```
然后需要定义激活函数,根据题目要求,隐含层使用tanh函数,输出层使用sigmoid函数。
```python
def tanh(x):
return np.tanh(x)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
```
接着,我们需要初始化权重矩阵,权重节点之间的权重初始值随机生成。
```python
input_hidden_weights = np.random.rand(input_nodes, hidden_nodes)
hidden_output_weights = np.random.rand(hidden_nodes, output_nodes)
```
然后需要定义训练数据和标签。根据题目要求,有3个类别的三维坐标点,每个类别10个样本点。
```python
data = []
labels = []
class1 = np.random.normal(1, 0.5, (10, 3))
class2 = np.random.normal(5, 0.5, (10, 3))
class3 = np.random.normal(9, 0.5, (10, 3))
data = np.concatenate((class1, class2, class3))
labels = np.array([0]*10 + [1]*10 + [2]*10).reshape(-1, 1)
```
接着,我们需要定义训练函数,采用梯度下降法寻优。
```python
def train(data, labels, input_hidden_weights, hidden_output_weights, epochs, learning_rate):
for epoch in range(epochs):
# 前向传播
hidden_inputs = np.dot(data, input_hidden_weights)
hidden_outputs = tanh(hidden_inputs)
outputs = sigmoid(np.dot(hidden_outputs, hidden_output_weights))
# 计算误差
error = labels - outputs
# 反向传播
output_error_term = error * outputs * (1 - outputs)
hidden_error_term = np.dot(output_error_term, hidden_output_weights.T) * (1 - hidden_outputs ** 2)
# 更新权重
hidden_output_weights += learning_rate * np.dot(hidden_outputs.T, output_error_term)
input_hidden_weights += learning_rate * np.dot(data.T, hidden_error_term)
# 打印误差和权重
if epoch % 10 == 0:
print("Epoch:", epoch)
print("Error:", np.mean(np.abs(error)))
print("Input-Hidden Weights:", input_hidden_weights)
print("Hidden-Output Weights:", hidden_output_weights)
print()
```
最后,我们可以调用训练函数进行训练。
```python
epochs = 100
learning_rate = 0.1
train(data, labels, input_hidden_weights, hidden_output_weights, epochs, learning_rate)
```
完整代码如下:
```python
import numpy as np
import random
def tanh(x):
return np.tanh(x)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
input_nodes = 3
hidden_nodes = 4
output_nodes = 1
input_hidden_weights = np.random.rand(input_nodes, hidden_nodes)
hidden_output_weights = np.random.rand(hidden_nodes, output_nodes)
data = []
labels = []
class1 = np.random.normal(1, 0.5, (10, 3))
class2 = np.random.normal(5, 0.5, (10, 3))
class3 = np.random.normal(9, 0.5, (10, 3))
data = np.concatenate((class1, class2, class3))
labels = np.array([0]*10 + [1]*10 + [2]*10).reshape(-1, 1)
def train(data, labels, input_hidden_weights, hidden_output_weights, epochs, learning_rate):
for epoch in range(epochs):
# 前向传播
hidden_inputs = np.dot(data, input_hidden_weights)
hidden_outputs = tanh(hidden_inputs)
outputs = sigmoid(np.dot(hidden_outputs, hidden_output_weights))
# 计算误差
error = labels - outputs
# 反向传播
output_error_term = error * outputs * (1 - outputs)
hidden_error_term = np.dot(output_error_term, hidden_output_weights.T) * (1 - hidden_outputs ** 2)
# 更新权重
hidden_output_weights += learning_rate * np.dot(hidden_outputs.T, output_error_term)
input_hidden_weights += learning_rate * np.dot(data.T, hidden_error_term)
# 打印误差和权重
if epoch % 10 == 0:
print("Epoch:", epoch)
print("Error:", np.mean(np.abs(error)))
print("Input-Hidden Weights:", input_hidden_weights)
print("Hidden-Output Weights:", hidden_output_weights)
print()
epochs = 100
learning_rate = 0.1
train(data, labels, input_hidden_weights, hidden_output_weights, epochs, learning_rate)
```
阅读全文