美文网首页Python数据科学程序员
深度学习入门--NumPy多维数组的运算

深度学习入门--NumPy多维数组的运算

作者: 爱吃西瓜的番茄酱 | 来源:发表于2019-03-22 19:56 被阅读6次

    想要高效地实现神经网络,离不开numpy多维数组的运算。

    一维数组

    先介绍numpy一维数组:

    In [1]: import numpy as np
    In [2]: A=np.array([1, 2, 3, 4])
    In [3]: print(A)
    [1 2 3 4]
    In [4]: np.ndim(A)  # 数组A的维数
    Out[4]: 1
    In [6]: A.shape  # 数组A的形状
    Out[6]: (4,)
    In [7]: A.shape[0]
    Out[7]: 4
    

    如上所示,数组的维数可以通过np.ndim()函数获得;数组的形状可以通过<数组名>.shape获得。

    二维数组

    In [8]: B=np.array([[1,2],[3,4],[5,6]])
    In [9]: print(B)
    [[1 2]
     [3 4]
     [5 6]]
    In [10]: np.ndim(B)
    Out[10]: 2
    In [11]: B.shape
    Out[11]: (3, 2)
    

    二维数组也称之为矩阵。

    矩阵乘法

    根据大学本科学的【线性代数】的知识可知:矩阵的乘积是通过左边矩阵的行和右边矩阵的列以对应元素相乘后再求和而得到的。

    并且矩阵A和矩阵B相乘积的前提是:矩阵A的列数等于矩阵B的行数。

    矩阵的乘积用代码实现如下:

    In [13]:  A=np.array([[1,2],[3,4]])
    In [14]: A.shape
    Out[14]: (2, 2)
    In [15]: B=np.array([[5,6],[7,8]])
    In [16]: B.shape
    Out[16]: (2, 2)
    In [17]: np.dot(A,B)  # A*B
    Out[17]:
    array([[19, 22],
           [43, 50]])
    

    矩阵的乘积可以通过numpy的np.dot()函数计算。np.dot()函数接收两个numpy数组作为参数,并返回数组的乘积。这里要注意,矩阵乘法没有交换律,即np.dot(A,B)一般不等于np.dot(B,A)

    利用numpy数组实现三层神经网络

    这里将输入信号、权重、偏置设置成任意值:

    import numpy as np
    
    # 中间层的激活函数sigmoid
    def sigmoid(x):
        return 1/(1+np.exp(-x))
    
    # 输出层的激活函数identity_function
    def identity_function(x):
        return x  
    
    # 初始化神经网络
    def init_network():
        network={}
        network['w1']=np.array([[0.1,0.3,0.5], [0.2,0.4,0.6]]) # 第一层的权重
        network['b1']=np.array([0.1,0.2,0.3])  # 第一层的偏置
        network['w2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])  # 第二层的权重
        network['b2']=np.array([0.1,0.2])  # 第二层的偏置
        network['w3']=np.array([[0.1,0.3], [0.2,0.4]])  # 第三层的权重
        network['b3']=np.array([0.1,0.2])  # 第三层的偏置
        
        return network
    
    # 神经网络的前向处理
    def forward(network, x):
        w1, w2, w3=network['w1'], network['w2'], network['w3']
        b1, b2, b3=network['b1'], network['b2'], network['b3']
        
        a1=np.dot(x, w1) + b1
        z1=sigmoid(a1) # 第一层的激活函数
        a2=np.dot(z1,w2) + b2 
        z2=sigmoid(a2)  # 第二层的激活函数
        a3=np.dot(z2, w3) + b3
        y=identity_function(a3)  # 输出层的激活函数(恒等函数)
        
        return y
    
    network=init_network()
    x=np.array([1.0, 0.5])  # 两个输入信号
    y=forward(network, x)   # 输出信号
    print(y)
    

    输出为:

    [0.31682708 0.69627909]
    

    这里主要有sigmoid()函数identity_function()函数init_network()函数forward()函数这四个函数:

    • sigmoid()函数:中间层的激活函数
    • identity_function()函数: 输出层的激活函数
    • identity_function()函数:进行权重和偏置的初始化,并将它们保存在字典变量network中。
    • forward()函数: 封装了将输入信号转换成输出信号的处理过程,这个过程称之为前向处理

    借助numpy多维数组,我们可以方便地实现神经网络。

    每天学习一点点,每天进步一点点。

    相关文章

      网友评论

        本文标题:深度学习入门--NumPy多维数组的运算

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