• 【学习笔记】深度学习入门:基于Python的理论与实现-Python入门与感知机


    一、Python入门

    1.1 NumPy

    在深度学习的实现中,经常出现数组和矩阵的计算。NumPy数组类(numpy.array)中提供了很多便捷的方法,在实现深度学习时,我们将使用这些方法。安装各种第三方库的方式详见:VS Code中安装Python机器学习与数据分析相关第三方模块教程

    导入NumPy:

    import numpy as np
    
    • 1

    生成NumPy数组

    x = np.array([1.0, 2.0, 3.0])
    print(x)  # [1. 2. 3.]
    
    • 1
    • 2

    NumPy数组算术运算:

    x = np.array([1.0, 2.0, 3.0])
    y = np.array([2.0, 4.0, 6.0])
    x + y  # [3. 6. 9.]
    x - y  # [-1. -2. -3.]
    x * y  # [2. 8. 18.]
    x / y  # [0.5 0.5 0.5]
    x / 2.0  # [0.5 1. 1.5],广播功能
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    多维NumPy数组:

    A = np.array([[1, 2], [3, 4]])
    A.shape  # (2, 2),查看A的形状
    A.dtype  # dtype('int64'),查看矩阵元素的数据类型
    
    • 1
    • 2
    • 3

    广播功能如下图所示:

    在这里插入图片描述
    在这里插入图片描述

    访问矩阵元素的方式:

    X = np.array([[51, 55], [14, 19], [0, 4]])
    X[0]  # array([51, 55]),第0行
    X[0][1]  # 55,(0, 1)位置的元素
    X = X.flatten()  # 将X转换为一维数组
    print(X)  # [51 55 14 19 0 4]
    X[np.array([0, 2, 4])]  # array([51, 14, 0]),获取索引为0、2、4的元素
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    X X X中抽取大于 15 15 15的元素:

    X > 15  # array([True, True, False, True, False, False], dtype=bool)
    X[X > 15]  # array([51, 55, 19])
    
    • 1
    • 2

    1.2 Matplotlib

    在深度学习的实验中,图形的绘制和数据的可视化非常重要。Matplotlib是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。

    绘制 s i n sin sin函数图像:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 生成数据
    x = np.arange(0, 6, 0.1)  # 以0.1为步长,生成[0, 6)的数据
    y = np.sin(x)
    
    # 绘制图形
    plt.plot(x, y)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    绘制结果如下图所示:

    在这里插入图片描述

    添加 c o s cos cos函数,并添加标题和 x x x轴标签名等其他功能:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 生成数据
    x = np.arange(0, 6, 0.1)  # 以0.1为步长,生成[0, 6)的数据
    y1 = np.sin(x)
    y2 = np.cos(x)
    
    # 绘制图形
    plt.plot(x, y1, label="sin")
    plt.plot(x, y2, linestyle="--", label="cos")  # 用虚线绘制
    plt.xlabel("x")  # x轴标签
    plt.ylabel("y")  # y轴标签
    plt.title('sin & cos')  # 标题
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    绘制结果如下图所示:

    在这里插入图片描述

    pyplot中还提供了用于显示图像的方法imshow()。另外,可以使用matplotlib.image模块的imread()方法读入图像:

    import matplotlib.pyplot as plt
    from matplotlib.image import imread
    
    img = imread('lena.png')  # 读入图像(设定合适的路径!这里假定图像lena.png在当前目录下)
    plt.imshow(img)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行上述代码后会显示下图所示的图像:

    在这里插入图片描述

    二、感知机

    2.1 感知机是什么

    感知机接收多个输入信号,输出一个信号。下图是一个接收两个输入信号的感知机的例子, x 1 , x 2 x_1,x_2 x1,x2是输入信号, y y y是输出信号, w 1 , w 2 w_1,w_2 w1,w2是权重( w w w w e i g h t weight weight的首字母)。图中的圆圈称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重( w 1 x 1 , w 2 x 2 w_1x_1,w_2x_2 w1x1,w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1 1 1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ \theta θ表示。

    在这里插入图片描述

    把上述内容用数学式来表示就如下式所示:

    在这里插入图片描述

    感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。

    2.2 简单逻辑电路

    现在考虑使用感知机来实现 A N D   g a t e AND\ gate AND gate,其真值表如下图所示:

    在这里插入图片描述

    满足上图条件的参数的选择方法有无数多个。当 ( w 1 , w 2 , θ ) = ( 0.5 , 0.5 , 0.7 ) (w_1,w_2,\theta )=(0.5,0.5,0.7) (w1,w2,θ)=(0.5,0.5,0.7)时,可以满足上图条件。设定这样的参数后,仅当 x 1 x_1 x1 x 2 x_2 x2同时为 1 1 1时,信号的加权总和才会超过给定的阈值 θ \theta θ

    2.3 感知机的实现

    用Python来实现上述的逻辑电路:

    def AND(x1, x2):
    	w1, w2, theta = 0.5, 0.5, 0.7
    	tmp = x1 * w1 + x2 * w2
    	if tmp <= theta:
    		return 0
    	elif tmp > theta:
    		return 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们将之前数学式中的 θ \theta θ换成 − b -b b,便可用以下式子表示感知机:

    在这里插入图片描述

    此处, b b b称为偏置 w 1 w_1 w1 w 2 w_2 w2称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于 0 0 0则输出 1 1 1,否则输出 0 0 0

    使用权重和偏置,可以像下面这样实现与门:

    def AND(x1, x2):
    	x = np.array([x1, x2])
    	w = np.array([0.5, 0.5])
    	b = -0.7
    	tmp = np.sum(w * x) + b
    	if tmp <= 0:
    		return 0
    	else:
    		return 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    请注意,偏置和权重 w 1 , w 2 w_1,w_2 w1,w2的作用是不一样的。具体地说, w 1 w_1 w1 w 2 w_2 w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为 1 1 1的程度)的参数。

    2.4 感知机的局限性

    X O R   g a t e XOR\ gate XOR gate真值表如下图所示:

    在这里插入图片描述

    用前面介绍的感知机是无法实现这个异或门的。以或门为例,当权重参数 ( b , w 1 , w 2 ) = ( − 0.5 , 1.0 , 1.0 ) (b,w_1,w_2)=(-0.5,1.0,1.0) (b,w1,w2)=(0.5,1.0,1.0)时,可满足其真值表条件,此时感知机可用下式表示:

    在这里插入图片描述

    此时感知机会生成由直线 − 0.5 + x 1 + x 2 = 0 -0.5+x_1+x_2=0 0.5+x1+x2=0分割开的两个空间。其中一个空间输出 1 1 1,另一个空间输出 0 0 0,如下图所示:

    在这里插入图片描述

    或门在 ( x 1 , x 2 ) = ( 0 , 0 ) (x_1,x_2)=(0,0) (x1,x2)=(0,0)时输出 0 0 0,在 ( x 1 , x 2 ) (x_1,x_2) (x1,x2) ( 0 , 1 ) , ( 1 , 0 ) , ( 1 , 1 ) (0,1),(1,0),(1,1) (0,1),(1,0),(1,1)时输出 1 1 1。上图中,圆圈表示 0 0 0,三角形表示 1 1 1

    异或门的输出如下图所示:

    在这里插入图片描述

    想要用一条直线将上图中的圆圈和三角形分开,无论如何都做不到。

    使用曲线分割成的非线性空间即可实现以上条件:

    在这里插入图片描述

    2.5 多层感知机

    感知机的绝妙之处在于它可以“叠加层”。异或门可以通过与门、与非门和或门组合进行实现,如下图所示:

    在这里插入图片描述

    假设这三种门均已实现,那么用Python实现异或门的代码如下:

    def XOR(x1, x2):
    	s1 = NAND(x1, x2)
    	s2 = OR(x1, x2)
    	y = AND(s1, s2)
    	return y
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下面我们试着用感知机的表示方法(明确地显示神经元)来表示这个异或门,如下图所示,异或门是一种多层结构的神经网络。这里,将最左边的一列称为第 0 0 0层,中间的一列称为第 1 1 1层,最右边的一列称为第 2 2 2层。

    在这里插入图片描述

    下一节:【学习笔记】深度学习入门:基于Python的理论与实现-神经网络

  • 相关阅读:
    Zookeeper简介
    Java中的图数据库应用:Neo4j入门
    How to install nodejs.16 to Linux mint 21.0
    极智AI | 讲解 TensorRT 显式batch 和 隐式batch
    计算机应用专业,报软考应该选什么?
    USB设备的音频类UAC
    信息系统项目管理师 第四版 第2章 信息技术发展
    【Docker】Docker Network(网络)
    OpenWrt之跳过tools编译
    4.2 sql手工注入和自动注入实战(OWASP实战训练)
  • 原文地址:https://blog.csdn.net/m0_51755720/article/details/128128915