这个专栏名为《Numpy从入门到精通》,顾名思义,是记录自己学习numpy的学习过程,也方便自己之后复盘!为深度学习的进一步学习奠定基础!希望能给大家带来帮助,爱睡觉的咋祝您生活愉快! 这一篇介绍《Numpy从入门到精通—— Numpy运算符|批处理

在前面几次分享中,我们学习了Numpy的矩阵生成,数据读存、获取、广播机制等,这一次我们进一步学习Numpy的算数运算符以及批处理

一.星乘(*)

星乘也称为对应元素相乘、逐元素相乘,对应的函数为np.multiply(),输出的大小与相乘数组或者矩阵的大小一致:

  • numpy.multiply(x1,x2,/,out=None,*,where=True,casting=“same_kind”,order=“k”,dtype=None,subok=True[,signature,extobj])

下面用程序进行说明:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_14.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/21 20:41 
"""
import numpy as np
A = np.array([[1, 2], [-1, 4]])
B = np.array([[2, 0], [3, 4]])
print(A * B)
#或另一种表示方法
print(np.multiply(A, B))

输出为:

[[ 2  0]
 [-3 16]]
[[ 2  0]
 [-3 16]]

可以看到,np.multiply()与*效果是一样的,numpy不仅可以对数组进行对应的元素相乘,也可以与单一的数值进行运算。运算时,numpy数组的每一个元素与标量进行运算,这也是广播机制的应用。下面通过代码进行说明:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_15.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/21 20:51 
"""
import numpy as np
A = np.array([1,2,3,4,5,6])
print(A*2.0)
print(A/2.0)

输出为下:

[ 2.  4.  6.  8. 10. 12.]
[0.5 1.  1.5 2.  2.5 3. ]

推而广之,一些激活函数也是可以基于np的广播机制特性的。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_16.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/21 20:56 
"""
import numpy as np
X = np.random.rand(2, 3)


def sigmoid(x):
    return 1 / (1 + np.exp(-x))


def relu(x):
    return np.maximum(0, x)


def softmax(x):
    return np.exp(x) / np.sum(np.exp(x))


print("输入参数X的形状:", X.shape)
print("激活函数sigmoid输出形状:", sigmoid(X).shape)
print("激活函数relu输出形状:", relu(X).shape)
print("激活函数softmax输出形状:", softmax(X).shape)

输出为:

输入参数X的形状: (2, 3)
激活函数sigmoid输出形状: (2, 3)
激活函数relu输出形状: (2, 3)
激活函数softmax输出形状: (2, 3)

二. 点乘(.)

点积运算又被称为内积运算,一般格式为:

  • np.dot(a,b,None)

我们直接通过程序来看dot的具体用法:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_17.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/21 21:04 
"""
import numpy as np
X1=np.array([[1,2],[3,4]])
X2=np.array([[5,6,7],[8,9,10]])
X3=np.dot(X1,X2)
print(X3)

输出为:

[[21 24 27]
 [47 54 61]]

和线性代数计算过程是一样的,具体计算过程可以看下面这张图:


从上面这个图我们也能看出来,如果X1与X2进行点积运算,X1的第二维度与X2的第一维度要是一样的。点积运算在神经网络中的使用是非常频繁的,在神经网络中输入I与权重矩阵W之间的运算就是点积运算:


这里的sigmoid就是激活函数,对应的公式上面已经写过,这里就不再赘述。

三.批处理

数据是深度学习的基础,在深度学习中,数据量往往是比较大的。所有我们通常要采用批处理的方式,比如说随机梯度方法(SGD),就是选用一批数据求模型的损失。如何把大数据分成多个批次呢?可以采用如下步骤:

  • 得到数据集
  • 随机打乱数据
  • 定义批大小
  • 批处理数据集

我们依然是直接通过代码来进行说明:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project :numpy学习 
@File    :task_18.py
@IDE     :PyCharm 
@Author  :咋
@Date    :2023/4/21 21:21 
"""
import numpy as np
#生成10000个形状为2X3的矩阵
data_train = np.random.randn(10000,2,3)
#这是一个3维矩阵,第一个维度为样本数,后两个是数据形状
print(data_train.shape)
#(10000,2,3)
#打乱这10000条数据
np.random.shuffle(data_train)
#定义批量大小
batch_size=100
#进行批处理
# print(np.sum(data_train))
# x_batch_sum =0
for i in range(0,len(data_train),batch_size):
    x_batch_sum=np.sum(data_train[i:i+batch_size])
print("第{}批次,该批次的数据之和:{}".format(i,x_batch_sum))

输出:

(10000, 2, 3)9900批次,该批次的数据之和:21.031025152935968

分批次输出,可以防止内存直接爆满,batch-size也是深度学习优化模型的一个重要参数!