美文网首页程序员想法
BP神经网络——Python简单实现三层神经网络(Numpy)

BP神经网络——Python简单实现三层神经网络(Numpy)

作者: 傻der仙儿哥哥 | 来源:发表于2020-05-16 20:26 被阅读0次

    BP神经网络(BPNN)基本由以下组件组成:

    • 输入层
    • 隐藏层
    • 输出层
    • 各层之间的权重
    • 每个隐藏层的激活函数(此中将用Sigmoid激活函数)

    代码思路

    一、创建一个NeuralNetwork类

    我们将在Python中创建一个NeuralNetwork类,以训练神经元以给出准确的预测。该课程还将具有其他帮助程序功能。

    1.应用Sigmoid函数
    我们将使用Sigmoid函数(它绘制一条“ S”形曲线)作为神经网络的激活函数。

    sigmoid
    此函数可以将任何值映射到0到1之间的值。它将帮助我们归一化输入的加权和。
    • 创建Sigmoid函数的导数,以帮助计算权重的基本调整。
    • Sigmoid函数的输出可用于生成其导数。例如,如果输出变量为“ x”,则其导数将为x (1-x)。

    2.训练模型
    这是我们将教神经网络做出准确预测的阶段。每个输入将具有权重(正或负)。
    这意味着具有大量正权重或大量负权重的输入将对结果输出产生更大的影响。

    我们最初是将每个权重分配给一个随机数。

    • 这是我们在此神经网络示例问题中使用的训练过程的过程:
    1. 我们从训练数据集中获取输入,根据它们的权重进行一些调整,然后通过一种计算ANN输出的方法虹吸它们。
    2. 我们计算了反向传播的错误率。在这种情况下,它是神经元的预测输出与训练数据集的预期输出之间的差异。
    3. 根据得到的误差的程度,我们使用误差加权导数公式进行了一些较小的权重调整。
    4. 我们对该过程进行了15,000次任意迭代。在每次迭代中,将同时处理整个训练集。
    二、主函数
    • 初始化类
    • 载入训练数据进行训练
    • 测试

    代码:

    '''
    author:小靳哥哥
    project:三层神BP经网络模型
    '''
    # 导入numpy并命名为np
    import numpy as np
    
    '''
    # 构造神经网络
    '''
    class NeuralNetwork():
        def __init__(self):
            # 随机数生成的种子随机数生成的种子
            np.random.seed(1)
            # 将权重转换为值为-1到1且平均值为0的3乘1矩阵
            self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
    
        # 定义signoid函数的导数
        def sigmoid(self, x):
            return 1 / (1 + np.exp(-x))
        # 计算sigmoid函数的导数
        def sigmoid_derivative(self, x):
            return x * (1 - x)
    
        # 训练
        def train(self, train_inputs, train_ou[图片上传中...(image-4f98b0-1589629804569)]
    tputs, train_iterations): # 输入 输出 迭代次数
            # 训练模型在不断调整权重的同时做出准确预测
            for iteration in range(train_iterations):
                # 通过神经元提取训练数据
                output = self.think(train_inputs)
                # 反向传播错误率
                error = train_outputs - output
                # 进行权重调整
                adjustments = np.dot(train_inputs.T, error * self.sigmoid_derivative(output))
                self.synaptic_weights += adjustments
        # 输出
        def think(self, inputs):
            inputs = inputs.astype(float)
            output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
            return output
    
    # 初始化类
    neural_network = NeuralNetwork()
    
    print("开始随机生成权重: ")
    print(neural_network.synaptic_weights)
    
    # 载入训练数据(3个输入值,一个输出值)
    train_inputs = np.array([[0, 0, 1],[1, 1, 1],[1, 0, 1],[0, 1, 1]])
    train_outputs = np.array([[0, 1, 1, 0]]).T
    neural_network.train(train_inputs, train_outputs, 150000)
    
    print("最终所得权重: ")
    print(neural_network.synaptic_weights)
    
    
    '''
    测试
    '''
    print('开始测试')
    input_1 = str(input("输入第一个值: "))
    input_2 = str(input("输入第一个值: "))
    input_3 = str(input("输入第一个值: "))
    
    print("输入值: [", input_1, input_2, input_3, ']')
    print("输出结果: ")
    print(neural_network.think(np.array([input_1, input_2, input_3])))
    
    

    本文参考翻译于此网站 —— 原文

    相关文章

      网友评论

        本文标题:BP神经网络——Python简单实现三层神经网络(Numpy)

        本文链接:https://www.haomeiwen.com/subject/juprohtx.html