NJU1healer的个人博客分享 http://blog.sciencenet.cn/u/NJU1healer

博文

numpy中的np.max 与 np.maximum区别以及 常用函数+实例代码(softmax)

已有 12405 次阅读 2020-8-20 08:57 |个人分类:Python|系统分类:科研笔记

1. 参数
首先比较二者的参数部分:

np.max:(a, axis=None, out=None, keepdims=False) 
求序列的最值
最少接收一个参数

axis:默认为列向(也即 axis=0),axis = 1 时为行方向的最值;
np.maximum:(X, Y, out=None) 
X 与 Y 逐位比较取其大者;
最少接收两个参数

2. 使用上
>> np.max([-2, -1, 0, 1, 2])
2

>> np.maximum([-2, -1, 0, 1, 2], 0)
array([0, 0, 0, 1, 2])

        # 当然 np.maximum 接受的两个参数,也可以大小一致
        # 或者更为准确地说,第二个参数只是一个单独的值时,其实是用到了维度的 broadcast 机制

点滴分享,福泽你我!Add oil!

3.代码实例

编写ReLU(Rectified Linear Unit)函数(激活函数),称修正线性单元

image.png

image.png

代码:

import numpy as np

def ReLU(x):

    return np.maximum(0,x)

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

y = ReLU(x)

print(y)

4. 常用函数

np.ndim()  获取维数

x.shape 获取数组形状,返回元组

np.dot(A,B) 两个矩阵相乘,点积;可应用到神经网络的内积

image.png

np.argmax(y)  其中:y为向量(或矩阵),作用:获取y值最高的元素的索引

                      具体说明:numpy中获取array的某一个维度中数值最大的那个元素的索引

                      详见:https://blog.csdn.net/t20134297/article/details/105007292/

np.sum()    求和,注意妙用,看一下例子。

       实例代码:         

        import numpy as np

        y = np.array([1,2,1,0])

        t = np.array([1,2,0,0])

        print(y==t)   #[ True  True False  True]

        np.sum(y==t)  #3  注:直接可以对布尔型数组求和

np.log()   表示以e为底的自然对数(loge);以交叉熵误差函数为例写代码:

image.png

image.png

        import numpy as np

        def cross_entropy_error(y,t):

             delta = 1e-7

             return -np.sum(t * np.log(y + delta))  

         #np.log(0)会变为负无穷大-inf,这样一来就会导致后续计算无法进行。作为保护性对策,添加一个微小值delta可以防止负无限大的发生!

         t=[0,0,1,0,0,0,0,0,0,0] #(one-hot表示

         y=[0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  #(softmax输出

         cross_entropy_error(np.array(y),np.array(t)) #0.510825457099338


         y=[0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.6,0.0,0.0]

         print(cross_entropy_error(np.array(y),np.array(t))) #2.302584092994546

np.random.choice()  可以从指定的数据中随机选择想要的数据,如:

         print(np.random.choice(60000,10)) #从0到59999之间随机选择10个数

         #输出 [ 5533  1909 24109 51750   345  5226  3927 41261 38667  6871]

        应用 案例展示:选出mini-batch

         mini-batch(小批量数据)可以作为全体训练数据的近似值!                                                                  

        train_size = x_train.shape[0]

        batch_size = 10

        batch_mask = np.random.choice(train_size,batch_size )

        x_batch = x_train[batch_mask]  #train_dataset

        t_batch = t_train[batch_mask]  #train_label

np.arange()     如np.arange(5)会生成一个Numpy数组[0,1,2,3,4]

        案例展示:

        y[np.arange(batch_size),t] #batch_size = 5; t = [2,7,0,9,4]

        #会生成Numpy数组[y[0,2],y[1,7],y[2,0],y[3,9],y[4,4]]   此种方式值得学习

numpy.zeros_like(a)  a是一个ndarray,即数组或矩阵。函数作用是生成像a一样大小的0矩阵。看代码:     

        In  [1]: a = np.arange(24).reshape(4,6)

        ...      a_0 = np.zeros_like(a)

        ...      a.shape

        ...      a_0.shape

        ...      a_0

        Out [1]: (4, 6)

        Out [1]: (4, 6)

        Out [1]: array([[0, 0, 0, 0, 0, 0],

                        [0, 0, 0, 0, 0, 0],

                        [0, 0, 0, 0, 0, 0],

                        [0, 0, 0, 0, 0, 0]]) 


综合案例展示:(实例代码:神经网络传递过程实现)

image.png

import numpy as np

def sigmoid(x):

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

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['W2']

    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)

注意:一般地,回归问题可以使用恒等函数;二分类问题可以使用sigmoid函数;多元分类问题可以使用softmax函数!

      softmax函数:输出总和为1是softmax函数的一个重要性质,正因为这个性质,我们才把softmax函数的输出解释为“概率”

def softmax(a):

    c = np.max(a)

    exp_a = np.exp(a - c) #溢出对策

    sum_exp_a = np.sum(exp_a)

    y = exp_a / sum_exp_a

    return y


点滴分享,福泽你我!Add oil!

【参考】

https://blog.csdn.net/qq_36387683/article/details/83509010



https://wap.sciencenet.cn/blog-3428464-1247082.html

上一篇:Python中函数:pop()、sklearn中shuffle、classification_report
下一篇:每次打开spyder 都报错:plugin = mod.PLUGIN_CLASS(self) AttributeErro
收藏 IP: 211.162.81.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

全部作者的其他最新博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-3-29 23:01

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部