【头歌实验】

第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 ##########
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐