上一篇我们讲了传统机器学习算法的局限性,今天我们讲讲神经网络如何做到识别图片并且精准分类的。

    让我们先来看下神经网络结构图:

图片

神经网络通常由多层神经元组成,主要分为输入层、隐藏层和输出层:

  • 输入层(Input Layer):接收原始数据输入,每个输入节点对应数据的一个特征。

  • 隐藏层(Hidden Layer):位于输入层和输出层之间的一层或多层神经元。隐藏层对输入进行非线性变换和特征提取,使得网络能够学习到更复杂的模式和表示。

  • 输出层(Output Layer):输出层的节点产生最终的模型输出,通常对应任务的预测结果。例如,在分类任务中,输出层的节点表示各个类别的预测概率。

    隐藏层的非线性变换其实是一种激活函数。激活函数在神经网络中起着至关重要的作用,它们是神经元内部的非线性转换函数,能够为网络引入非线性特性,从而使神经网络能够学习复杂的模式和特征,提高网络的表达能力和拟合能力。线性变换的叠加仍然是线性的,如果神经网络中只有线性操作(如线性加权求和),那么整个网络就只能表示线性关系,无法学习和表示复杂的非线性关系。激活函数通过对神经元输出进行非线性变换,使得整个网络能够学习和表示更加复杂的非线性关系,提高模型的表达能力。并且非线性激活函数可以将输入的线性组合映射到更复杂的输出空间中,从而使神经网络能够逼近任意复杂的函数关系,实现更准确的模型拟合。在此我介绍两种激活函数:Sigmoid和Softmax函数。

    Sigmoid:数学表达式如下

图片

我们看下他的图像

图片

    它将实数映射到 (0, 1) 的区间内,这种激活函数很适用于二分类,并且Sigmoid 函数是连续且可导的函数,具有良好的平滑性,适合用作神经网络中的激活函数,有利于梯度的计算和反向传播。

    Softmax:数学表达式如下

图片

    其中,zi是输入向量 z 的第 i 个元素,e 是自然常数(欧拉数),K 是类别的数量。

    Softmax 函数是一种常用的激活函数,通常用于多分类任务的输出层,将神经网络的原始输出转化为概率分布,使得每个类别的预测概率值都在 (0, 1) 之间且和为 1。

    

接下来我们简单举个例子来说明神经网络是如何工作的

    假设输入 x 是一个 3x3 的矩阵,让我们通过一个简单的示例来说明神经网络如何工作。

首先各层准备工作如下

  • 输入层: 接收一个 3x3 的矩阵 x,将其展平成一个 1x9 的向量作为输入。

  • 隐藏层: 包含 4 个神经元,使用 Sigmoid 激活函数。

  • 输出层: 包含 1 个神经元,用于二分类,输出预测结果。

            输入层处理:

      • 将 3x3 的矩阵 x 展平成一个 1x9 的向量作为神经网络的输入。

        隐藏层计算:

      • 输入层的输出作为隐藏层的输入,通过权重矩阵 w和偏置向量b

        加权求和(f=w*x+b),并应用 Sigmoid 激活函数。

      • 假设隐藏层有 4 个神经元,因此隐藏层的输出a1是一个1*4的向量。同理可得w是一个4*9的向量。b是一个1*4的向量。

        输出层计算
        • 隐藏层的输出a1作为输出层的输入,通过权重矩阵 w1和偏置向量b1

        加权求和(f=w1*a1+b1),并应用 Sigmoid 激活函数。输出y是一个标量,表示神经网络的预测结果。

        softmax激活函数同理。

        代码如下所示;

    import numpy as np

    # 定义输入矩阵 x

    x = np.array([[1, 2, 3],

                  [4, 5, 6],

                  [7, 8, 9]])

    # 展平输入矩阵作为神经网络的输入

    x_flattened = x.flatten()  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

    # 定义隐藏层和输出层的参数

    np.random.seed(0)

    W1 = np.random.randn(9, 4)  # 输入层到隐藏层的权重矩阵,9个输入特征对应4个隐藏层神经元

    b1 = np.random.randn(4)     # 隐藏层的偏置向量,与隐藏层神经元个数相同

    W2 = np.random.randn(4)      # 隐藏层到输出层的权重向量,4个隐藏层神经元对应1个输出层神经元

    b2 = np.random.randn()       # 输出层的偏置,与输出层神经元个数相同

    # 定义 Sigmoid 激活函数

    def sigmoid(z):

        return 1 / (1 + np.exp(-z))

    # 前向传播计算隐藏层和输出层的输出

    # 计算隐藏层的输出

    z1 = np.dot(x_flattened, W1) + b1  # 加权求和

    a1 = sigmoid(z1)                   # 应用激活函数

    # 计算输出层的输出

    z2 = np.dot(a1, W2) + b2           # 加权求和

    y_hat = sigmoid(z2)                # 应用激活函数,得到预测输出

    # 输出预测结果

    print("预测输出:", y_hat)

        但是前向传播的结果不一定准确,我们需要通过反向传播来更新初始化的参数w和b,使得预测的结果更加逼近真实结果,下一篇我们会继续介绍,如何通过反向传播更新参数,感兴趣的点个在看和关注吧~

Logo

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

更多推荐