【头歌】神经网络学习之前馈神经网络

第1关:单层感知器网络

import numpy as np

class Perception(object):
    def __init__(self,lr=0.1,epochs=1000):
        """
        初始化
        :param lr: 学习
        :param n_iter:
        """
        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 ,1,-1)
        ########## End ##########
        return prediction

第2关:BP神经网络

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 = np.dot(X, self.w1) + self.b1  
        hidden = self.sigmoid(hidden)    
        output = np.dot(hidden, self.w2) + self.b2  
        output = self.sigmoid(output)

        # 隐藏层到输出层的向前传播
        
        ########## End ##########
        return hidden,output

    def update(self,X,y):
        """
        根据误差,更新权重与偏置
        :param X: 输入
        :param y: 真实值
        """
        hidden,output = self.forward(X)
########## Begin ##########
        # 输出层误差改变量

        # 隐藏层误差改变量

        # 输出层对隐藏层的权重改变量

        # 隐藏层对输入层的权重改变量

        # 更新权重以及偏置
        output_loss = (y - output) * self.dsigmoid(output)  
        hidden_loss = output_loss.dot(self.w2.T) * self.dsigmoid(hidden)    
        w2_delta = self.lr * hidden.T.dot(output_loss) / X.shape[0]   
        w1_delta = self.lr * X.T.dot(hidden_loss) / X.shape[0]  
        self.w1 = self.w1 + w1_delta  
        self.w2 = self.w2 + w2_delta
        self.b2 = self.b2 + self.lr * np.mean(output_loss, axis=0)  
        self.b1 = self.b1 + self.lr * np.mean(hidden_loss, axis=0)  


        ########## End ##########

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
神经网络是一种模仿人脑神经网络的计算模型,它由大量的人工神经元相互连接而成。在Python中,有多个库可以用来构建和训练神经网络,如PyTorch、Theano、TensorFlow和Keras等。其中,Keras是一个高级神经网络API,它可以在多个后端引擎中运行,包括TensorFlow。 要构建神经网络,首先需要定义模型的架构。这包括定义神经网络的层数、每一层的神经元数量以及激活函数等。然后,需要选择损失函数和优化算法来训练模型。 例如,以下是使用Keras构建一个简单的全连接神经网络来解决异或(XOR)问题的示例代码: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation from keras.optimizers import SGD # 异或问题的训练样本 x_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_train = np.array([[0], [1], [1], [0]]) model = Sequential() num_neurons = 10 # 全连接隐藏层包含10个神经元 model.add(Dense(num_neurons, input_dim=2)) model.add(Activation('tanh')) model.add(Dense(1)) model.add(Activation('sigmoid')) model.summary() # 使用随机梯度下降算法进行训练 sgd = SGD(lr=0.1) model.compile(loss='binary_crossentropy', optimizer=sgd) # 拟合模型 model.fit(x_train, y_train, epochs=1000, verbose=0) # 使用模型进行预测 predictions = model.predict(x_train) ``` 在这个例子中,我们使用了一个包含10个神经元的全连接隐藏层,并使用了tanh和sigmoid激活函数。我们使用二元交叉熵作为损失函数,使用随机梯度下降算法进行模型训练。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MQiyirs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值