【头歌实验】神经网络学习之前馈神经网络
·
【头歌实验】
第1关:单层感知器网络
题目
-
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,编写单层感知器网络,完成分类任务。其中,fit 函数已经给出,只需实现 forward 函数和 predict 函数。 -
测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
100%
代码
import numpy as np
class Perception(object):
def __init__(self,lr=0.1,epochs=1000):
"""
初始化
:param lr: 学习率
:param epochs: 训练轮数
"""
self.lr = lr
self.epochs = epochs
def fit(self,X,y):
"""
训练
:param X: 训练数据的输入
:param y: 真实期望
"""
self.w_ = np.random.random(X.shape[1])
self.b = np.zeros([1])
for _ in range(self.epochs):
for x_i, target in zip(X,y):
update = self.lr * (target - self.predict(x_i))
self.w_ = self.w_ + (update * x_i)
self.b += update
def forward(self,X):
"""
向前传播
:param X: 输入
:return: 非经激活的预测值
"""
########## Begin ##########
# 将权重向量与训练数据输入单层感知器,进行向前传播
y_hat = np.dot(X, self.w_) + self.b
########## End ##########
return y_hat
def predict(self,X):
"""
预测函数,对前向传播后的结果进行分类
:param X: 输入值
:return: 对于数据类别的预测结果
"""
########## Begin ##########
# 可以使用 np.where() 函数来实现阶梯式的激活函数
prediction = np.where(self.forward(X) >= 0.0, 1, -1)
########## End ##########
return prediction
第2关:BP神经网络
题目
-
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,构建 BP 神经网络解决异或问题。 -
测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
True
代码
import numpy as np
class BPNet(object):
def __init__(self,num_inputs,num_hiddens,num_outputs,lr=0.1,epochs=100000):
"""
初始化
:param num_inputs: 输入的个数
:param num_hiddens: 隐藏层神经元的个数
:param num_outputs: 输出层神经元的个数
:param lr: 学习速率
:param epochs: 训练迭代次数
"""
self.w1 = np.random.random((num_inputs,num_hiddens))*2 - 1 # 隐藏层的权重,取之范围为 [ -1,1 ]
self.b1 = np.zeros(num_hiddens) # 隐藏层的偏置
self.w2 = np.random.random((num_hiddens,num_outputs))*2 - 1 # 输出层的权重,取之范围为 [ -1,1 ]
self.b2 = np.zeros(num_outputs) # 输出层偏置
self.lr = lr
self.epochs = epochs
# sigmoid 激活函数
def sigmoid(self,X):
return 1/(1+np.exp(-X))
# sigmoid 函数的导数
def dsigmoid(self,X):
return X*(1-X)
def fit(self,X,y):
"""
训练网络
:param X: 训练样本输入
:param y: 真实值
"""
for epoch in range(self.epochs):
self.update(X,y)
def forward(self,X):
"""
逐层进行进行向前传播
:param X: 输入
:return: 隐藏层与输出层的向前传播的结果
"""
########## Begin ##########
# 输入层到隐藏层的向前传播
hidden_input = np.dot(X, self.w1) + self.b1
hidden = self.sigmoid(hidden_input)
# 隐藏层到输出层的向前传播
output_input = np.dot(hidden, self.w2) + self.b2
output = self.sigmoid(output_input)
########## End ##########
return hidden, output
def update(self,X,y):
"""
根据误差,更新权重与偏置
:param X: 输入
:param y: 真实值
"""
hidden, output = self.forward(X)
########## Begin ##########
# 输出层误差改变量
output_error = y - output
output_delta = output_error * self.dsigmoid(output)
# 隐藏层误差改变量
hidden_error = np.dot(output_delta, self.w2.T)
hidden_delta = hidden_error * self.dsigmoid(hidden)
# 输出层对隐藏层的权重改变量
w2_change = np.dot(hidden.T, output_delta) * self.lr
b2_change = np.sum(output_delta, axis=0) * self.lr
# 隐藏层对输入层的权重改变量
w1_change = np.dot(X.T, hidden_delta) * self.lr
b1_change = np.sum(hidden_delta, axis=0) * self.lr
# 更新权重以及偏置
self.w2 += w2_change
self.b2 += b2_change
self.w1 += w1_change
self.b1 += b1_change
########## End ##########
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)