深度学习基础:NumPy中的array与random

发表:2年前 更新:1年前

NumPy 库操作之 array 与 random

1.array

关键属性:维度 元素类型

在 NumPy 中,可以方便的创建的各种不同类型的多维数组,并执行一些基本操作.

在深度学习中,如果神经元之间的连接关系涉及的参数是数组,便可利用 array 模块进行设定

我们可在 python 命令行中体验一下 array 的基本操作:

>>> import numpy as np
>>> a = [1,2,3,4]
>>> type(a)
<class 'list'>  #a是python中的list类型法国
>>> b = np.array(a)
>>> type(b)  
<class 'numpy.ndarray'>  #数组化之后,b的类型变为array
>>> b.shape
(4,) #shape参数表示array的大小,这里是4
>>> b.argmax()
3  #调用argmax()函数可以求得array中的最大值的索引,这里是3
>>> b.max()
4  #调用max()函数可以求得array中的最大值,这里是4
>>> b.mean()
2.5  #调用mean()函数可以求得array中的平均值,这里是2.5

在深度学习中,常用到的矩阵的转置操作可以同各国 matrix 构建矩阵,再用 tranpose 函数来实现转置:

>>> import numpy as np
>>> x = np.matrix([[1, 3, 5], [2, 4, 6]])  
>>> print (x)
[[1 3 5]
 [2 4 6]]
>>> type(x)
<class 'numpy.matrix'>
>>> y = np.matrix("1,2,3;4,5,6;7,8,9")
>>> print(y)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
>>> type(y)
<class 'numpy.matrix'>
>>> t = y.transpose()
>>> print(t)
[[1 4 7]
 [2 5 8]
 [3 6 9]]

此外,对于一维的 array,array 支持所有 Python 列表(list)支持的下标操作方法

#绝对值,1
a = np.abs(-1)

#sin函数,1.0
b = np.sin(np.pi/2)

#tanh逆函数,0.50000107157840523
c = np.arctanh(0.462118)

#e为底的指数函数,20.085536923187668
d = np.exp(3)

#2的3次方,8
f = np.power(2,3)

#点积,1*3+2*4=11
g = np.dot([1,2],[3,4])

#开方,5
h = np.sqrt(25)

#求和,10
i = np.sum([1,2,3,4])

#平均值,5.5
m = np.mean([4,5,6,7])

#标准差,0.96824583655185426
p = np.std([1,2,3,2,1,3,2,0])

2.random

Python 本身也有 random 模块,不过 NumPy 的 random 功能更丰富,它包含了与随机数产生和统计分布相关的基本函数,一般用于深度学习中一些随机数的生成、seed 的生成以及初始值的设定

下面演示一下 random 模块相关操作:

#设置随机数种子
>>> np.random.seed(42)  
>>> np.random.rand(1,3)
array([[0.37454012, 0.95071431, 0.73199394]])  #产生一个1x3,[0,1)之间的浮点型随机数
>>> np.random.random()
0.5986584841970366  #产生一个[0,1)之间的浮点型随机数
>>> a = np.array([1,2,3,4,5,6,7])
>>> np.random.choice(a,7)
array([7, 2, 3, 7, 3, 3, 5])  #从a中有放回的随机采样7个
>>> np.random.choice(a,7,replace=false)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'false' is not defined
>>> np.random.choice(a,7,replace=False)
array([1, 6, 7, 2, 5, 3, 4])  #从a中无放回的随机采样7个
>>> b = np.random.permutation(a)
>>> print(b)
[6 3 7 1 5 4 2]  #对a进行乱序并返回一个新的array
>>> np.random.bytes(9)
b'\\xfc\\x18\\xcf\\x01\\xeb\\xf2\\x93nX'  #生成一个长度为9的随机bytes序列并作为str返回

随机模块可以很方便地做一些快速模拟去验证结论,在神经网络中也能够做一些快速的网络构造。

如考虑一个非常违反直觉的概率题:一个选手去参加一个 TV 秀,有三扇门,其中一扇门后有奖品,这扇门只有主持人知道。选手先随机选一扇门,但并不打开,主持人看到后,会打开其余两扇门中没有奖品的一扇门。然后主持人问选手:是否要改变一开始的选择?

这个问题的答案是应该改变一开始的选择。在第一次选择的时候,选错的概率是 2/3,选对的概率是 1/3。第一次选择之后,主持人相当于帮忙剔除了一个错误答案,所以如果一开始选的是错的,这时候换掉就对了;而如果一开始就选对了,则这时候换掉就错了。根据以上分析,一开始选错的概率就是换掉之后选对的概率(2/3),这个概率大于一开始就选对的概率(1/3),所以应该换

虽然道理上是这样的,但是通过推理仍不明白怎么办?没关系,用随机模拟就可以轻松得到答案。

下一节:

深度学习基础:NumPy 中的广播机制和向量化

signature
这个人没有签名
评论

无权限

请登录后评论

RunPod公众号

赞助商

联系我们

QQ群:798695907

邮箱:laravel@88.com