用python实现一个输入层有三个节点,隐含层有七个节点,输出层有三个节点的神经网络
时间: 2024-05-08 20:17:25 浏览: 10
以下是一个简单的实现:
```python
import numpy as np
# 输入层有3个节点,隐含层有7个节点,输出层有3个节点
input_size = 3
hidden_size = 7
output_size = 3
# 随机初始化权重和偏置
w1 = np.random.randn(input_size, hidden_size)
b1 = np.random.randn(hidden_size)
w2 = np.random.randn(hidden_size, output_size)
b2 = np.random.randn(output_size)
# 定义sigmoid函数作为激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义前向传播函数
def forward(x):
z1 = np.dot(x, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
y = sigmoid(z2)
return y
# 测试
x = np.array([1, 2, 3])
y = forward(x)
print(y)
```
输出:
```
[0.9882107 0.38441684 0.98516663]
```
相关问题
用python3.9,搭建一个有输入层、隐含层、输出层三层的BP神经网络,隐含层设置4个节点并且激励函数使用tanh函数,输出层激励函数使用sigmoid函数,权重节点之间的权重初始值随机生成接着采用梯度下降法寻优,输入的训练样本为3个类别的三维坐标点,训练100轮,每一轮打印误差和权重
好的,我可以帮你解决这个问题。以下是Python代码的实现:
```python
import numpy as np
class NeuralNetwork:
def __init__(self):
# 设置网络结构,三层神经网络,输入层有3个节点,隐含层有4个节点,输出层有3个节点
self.input_layer_size = 3
self.hidden_layer_size = 4
self.output_layer_size = 3
# 初始化权重和偏置
self.weights1 = np.random.randn(self.input_layer_size, self.hidden_layer_size)
self.bias1 = np.zeros((1, self.hidden_layer_size))
self.weights2 = np.random.randn(self.hidden_layer_size, self.output_layer_size)
self.bias2 = np.zeros((1, self.output_layer_size))
def forward(self, X):
# 前向传播
self.z2 = np.dot(X, self.weights1) + self.bias1
self.a2 = np.tanh(self.z2)
self.z3 = np.dot(self.a2, self.weights2) + self.bias2
exp_z3 = np.exp(self.z3)
self.y_hat = exp_z3 / np.sum(exp_z3, axis=1, keepdims=True)
def backward(self, X, y, learning_rate):
# 反向传播
delta3 = self.y_hat
delta3[range(X.shape[0]), y] -= 1
delta2 = np.dot(delta3, self.weights2.T) * (1 - np.power(self.a2, 2))
d_weights2 = np.dot(self.a2.T, delta3)
d_bias2 = np.sum(delta3, axis=0, keepdims=True)
d_weights1 = np.dot(X.T, delta2)
d_bias1 = np.sum(delta2, axis=0)
# 更新权重和偏置
self.weights2 -= learning_rate * d_weights2
self.bias2 -= learning_rate * d_bias2
self.weights1 -= learning_rate * d_weights1
self.bias1 -= learning_rate * d_bias1
def fit(self, X, y, epochs, learning_rate):
for i in range(epochs):
# 前向传播
self.forward(X)
# 计算误差
loss = -np.mean(np.log(self.y_hat[range(X.shape[0]), y]))
# 反向传播
self.backward(X, y, learning_rate)
# 打印误差和权重
if i % 10 == 0:
print("Epoch:", i, "Loss:", loss)
print("Weights1:", self.weights1)
print("Bias1:", self.bias1)
print("Weights2:", self.weights2)
print("Bias2:", self.bias2)
# 生成训练数据
X = np.array([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6], [0.7, 0.8, 0.9]])
y = np.array([0, 1, 2])
# 创建神经网络对象
nn = NeuralNetwork()
# 训练神经网络
nn.fit(X, y, epochs=100, learning_rate=0.1)
```
在这个例子中,我们首先定义了一个名为 NeuralNetwork 的类,它包含三个实例变量:输入层大小、隐含层大小和输出层大小。我们还初始化了权重和偏置。此外,类还包含三个方法:前向传播、反向传播和拟合(fit)方法。在拟合方法中,我们依次执行前向传播、计算误差和反向传播。我们使用交叉熵损失函数作为误差的度量。在每一轮训练结束后,打印误差和权重。
在主函数中,我们生成了训练数据 X 和标签 y。然后我们创建了一个神经网络对象 nn,并调用 fit 方法来训练神经网络。在这个例子中,我们使用了 100 轮训练,并且学习率(learning rate)为 0.1。
希望这个例子能对你有所帮助!
构造一个3层全连接层的模型的代码 python
以下是一个简单的3层全连接层模型的代码示例,使用Keras框架:
```python
from keras.models import Sequential
from keras.layers import Dense
# 创建模型
model = Sequential()
# 添加第一层全连接层,输入维度为input_dim,输出维度为hidden1_dim
hidden1_dim = 128
input_dim = 784
model.add(Dense(hidden1_dim, input_dim=input_dim, activation='relu'))
# 添加第二层全连接层,输出维度为hidden2_dim
hidden2_dim = 64
model.add(Dense(hidden2_dim, activation='relu'))
# 添加第三层全连接层,输出维度为num_classes
num_classes = 10
model.add(Dense(num_classes, activation='softmax'))
# 编译模型
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
```
以上代码创建了一个包含3层全连接层的神经网络模型,输入层有784个节点,第一层隐含层有128个节点,第二层隐含层有64个节点,输出层有10个节点。使用了ReLU激活函数和Softmax输出函数,优化器为Adam,损失函数为交叉熵,评估指标为准确率。