用numpy实现简单的3层神经网络

import numpy as np

#激活函数
def sigmoid(x):
return 1/(1 + np.exp(-x))

#输出层时使用的‘激活函数’
def outputtype(x):
return x
#softmax函数
def softmax(a):
c = np.max(a)
exp_a = np.exp(a-c) #防止计算溢出,所以同时减去输入信号中的最大值,
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
#输入层到第一层
X = np.array([1.0, 0.5]) #输入的数据
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) #第一层的权重
B1 = np.array([0.1, 0.2, 0.3]) #第一层的偏置
A1 = np.dot(X,W1)+B1 # np.dot矩阵的乘积运算
Z1 = sigmoid(A1) #j激活函数
print(‘A1:’,A1)
print(‘Z1:’,Z1)

#第一层到第二层
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2])
A2 = np.dot(Z1,W2)+B2
Z2 = sigmoid(A2)
print(np.dot(X,W1))
print(‘A2:’,A2)
print(‘Z2:’,Z2)

#第二层到输出层
W3 = np.array([[0.1, 0.3],[0.2, 0.4]])
B3 = np.array([0.1,0.2])
A3 = np.dot(Z2,W3)+B3
Y = outputtype(A3) #输出层时使用的‘激活函数’
Y = np.argmax(A3) #返回numpy列表中最大值的下标
print(‘A3:’,A3)
print(A3.max())
print(Y)

运行代码输出:
在输出结果会哦这里插入图片描述

关于输出层使用的激活函数说明

输出层所使用的激活函数,要根据求解问题的性质决定。一般而言,

1、回归问题可以使用恒等函数作为激活函数(如上述自定义的outputtype函数)
2、二元分类问题可以使用sigmoid函数作为激活函数
def sigmoid(x):
return 1/(1 + np.exp(-x))
在这里插入图片描述
3、多元分类问题可以使用softmax函数作为激活函数。
def softmax(a):
c = np.max(a) #防止计算溢出,所以同时减去输入信号中的最大值,
#同时加上或减去一个常数并不会影响结果。
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用numpy实现简单神经网络的示例代码: ```python import numpy as np class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.W1 = np.random.randn(input_size, hidden_size) # 输入到隐藏的权重矩阵 self.b1 = np.zeros((1, hidden_size)) # 隐藏的偏置向量 self.W2 = np.random.randn(hidden_size, output_size) # 隐藏到输出的权重矩阵 self.b2 = np.zeros((1, output_size)) # 输出的偏置向量 def forward(self, X): # 前向传播计算输出 self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = np.tanh(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.a2 = self.sigmoid(self.z2) return self.a2 def backward(self, X, y, learning_rate): m = X.shape[0] # 样本数量 # 反向传播更新权重和偏置 delta2 = self.a2 - y dW2 = (1 / m) * np.dot(self.a1.T, delta2) db2 = (1 / m) * np.sum(delta2, axis=0, keepdims=True) delta1 = np.dot(delta2, self.W2.T) * (1 - np.power(self.a1, 2)) dW1 = (1 / m) * np.dot(X.T, delta1) db1 = (1 / m) * np.sum(delta1, axis=0, keepdims=True) self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 def train(self, X, y, epochs, learning_rate): for epoch in range(epochs): output = self.forward(X) self.backward(X, y, learning_rate) if epoch % 100 == 0: loss = self.calculate_loss(y, output) print(f"Epoch {epoch}, loss: {loss:.4f}") def predict(self, X): return self.forward(X) def calculate_loss(self, y_true, y_pred): return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) ``` 上述代码定义了一个名为NeuralNetwork的类,它具有输入、隐藏和输出。在初始化函数中,随机初始化了权重矩阵和偏置向量。forward函数实现了前向传播,backward函数实现了反向传播和更新权重和偏置。train函数用于训练神经网络,predict函数用于进行预测。calculate_loss函数计算损失函数的值,sigmoid函数实现了激活函数sigmoid。 你可以根据自己的需求修改代码中的参数和结构,比如调整隐藏的大小、修改激活函数等。然后使用训练集进行训练,最后使用测试集进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值