python人工智能开发基础篇:数据处理

2023-08-0917:53:19人工智能与大数据Comments966 views字数 4678阅读模式

python人工智能开发基础篇:数据处理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

1.环境搭建

1.1 安装Miniconda

windows安装miniconda比较简单不再赘述。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

https://docs.conda.io/en/latest/miniconda.html

下载win版安装即可。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

1.2 创建环境

打开cmd命令行执行如下命令:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

conda create --name d2l python=3.9 -y

激活 d2l 环境:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

conda activate d2l

安装pytorch,之前在公众号有发过深度学习环境的搭建教程,这里直接根据自己的cuda版本执行命令即可文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113

1.3 安装jupyter notebook

jupyter 算是python学习很不错的一款工具,这里不再赘述文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

在启动jupyter notebook时,有报错信息,如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

ModuleNotFoundError: No module named  jupyter_nbextensions_configurator文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

解决报错:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

  1. python -m pip install --user jupyter_contrib_nbextensions
  2. python -m pip install --user jupyter_nbextensions_configurator

2.数据操作

首先我们介绍n维数组,也称为张量(tensor).在pytorch中的张量与Numpy的ndarray类似。但深度学习的框架比Numpy中的ndarray多一些重要的功能:首先GPU很好地支持加速计算,其次,张量类支持自动微分。这些功能使得张量类更适合深度学习。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

2.1.1 入门

首先,我们导入torch文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

import torch

张量表示一个由数值组成的数组,这个数组可能有多个维度。具有一个轴的张量对应数学上的向量(vector);具有两个轴的张量对应数学上的矩阵(matrix);具有两个轴以上的张量没有特殊的数学名称。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

首先,我们使用arange创建一个行向量x。这个行向量包含以0开始的前12个整数,它们默认创建为整数。也可以指定创建类型为浮点数。张量中的每个值都称为张量的元素(element)。除非额外指定,新的张量将存储在内存中,并采用CPU计算。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

x = torch.arange(12)

x

tensor([0,1,2,3,4,5,6,7,8,9,10,11])文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

可以通过张量的shape属性类访问张量的形状。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

张量的形状指的是每个(Dimension)轴由多少个元素组成的信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

x.shape

torch.Size([12])文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

#张量中元素的总数
x.numel()
12
#要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。例如,可以把张量x从形状为(12,)的行向量转换为形状为(3,4)的矩阵。
#注意,通过改变张量的形状,张量的大小不会改变。
X = x.reshape(3,4)
X
tensor([[ 0, 1, 2, 3],
      [ 4, 5, 6, 7],
      [ 8, 9, 10, 11]])
#生成全0的张量
torch.zeros((2,3,4))  
tensor([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

      [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])
#生成全1的张量
torch.ones((2,3,4))
tensor([[[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]],

      [[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]]])
#生成随机值,且每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
torch.randn((2,3))
tensor([[-0.7534, -0.4173, 0.8888],
      [-1.5095, -0.6197, -0.4746]])
# 通过python列表为张量赋值 ,在这里,最外层的列表对应于轴0,内层的列表对应于轴1。
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
tensor([[2, 1, 4, 3],
      [1, 2, 3, 4],
      [4, 3, 2, 1]])

2.1.2 运算符

对于任意具有相同形状的张量, 常见的标准算术运算符(+-*/**)都可以被升级为按元素运算。我们可以在同一形状的任意两个张量上调用按元素操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

#运算符
x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x + y,x - y,x * y,x / y,x ** y
(tensor([ 3., 4., 6., 10.]),
tensor([-1., 0., 2., 6.]),
tensor([ 2., 4., 8., 16.]),
tensor([0.5000, 1.0000, 2.0000, 4.0000]),
tensor([ 1., 4., 16., 64.]))
#求幂运算
torch.exp(x)
tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])
#多个张量连结(concatenate)

X = torch.arange(12,dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
torch.cat((X,Y),dim=0),torch.cat((X,Y),dim=1) #按行连结,按列连结
(tensor([[ 0., 1., 2., 3.],
        [ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.],
        [ 2., 1., 4., 3.],
        [ 1., 2., 3., 4.],
        [ 4., 3., 2., 1.]]),
tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.],
        [ 4., 5., 6., 7., 1., 2., 3., 4.],
        [ 8., 9., 10., 11., 4., 3., 2., 1.]]))
#通过逻辑运算符构建二元张量
X == Y
tensor([[False, True, False, True],
      [False, False, False, False],
      [False, False, False, False]])
#对张量中的所有元素求和会产生一个单元素张量
X.sum()
tensor(66.)

2.1.3 广播机制

#在某些情况下,即使张量形状不同,我们也可以通过调用广播机制来执行按元素操作
#这种机制的工作方式如下:
#通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;
#对生成的数组执行按元素操作。
#在大多数情况下,我们将沿着数组中长度为1的轴进行广播,如下例子:
a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))
a,b,torch.arange(2)
(tensor([[0],
        [1],
        [2]]),
tensor([[0, 1]]),
tensor([0, 1]))
#由于a和b分别是矩阵,如果让它们相加,它们的形状不匹配。我们将两个矩阵广播为一个更大的矩阵,
#如下所示:矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。
a + b
tensor([[0, 1],
      [1, 2],
      [2, 3]])

2.1.4 索引和切片

就像在任何其他Python数组中一样,张量中的元素可以通过索引访问。与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1;可以指定范围以包含第一个元素和最后一个之前的元素。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

如下所示,我们可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

X[-1],X[1:3]
(tensor([ 8., 9., 10., 11.]),
tensor([[ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.]]))
#指定元素写入矩阵
X[1,2] = 9
X
tensor([[ 0., 1., 2., 3.],
      [ 4., 5., 9., 7.],
      [ 8., 9., 10., 11.]])
#多个元素赋相同值 [0:2, :]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素
X[0:2,:] = 12
X
tensor([[12., 12., 12., 12.],
      [12., 12., 12., 12.],
      [ 8., 9., 10., 11.]])

2.1.5 节省内存

运行一些操作可能会导致为新结果分配内存。例如,如果我们用Y = X + Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

# id()函数提供了内存中引用对象的确切地址
#运行Y = Y + X后,我们会发现id(Y)指向另一个位置。这是因为Python首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置。
before = id(Y)
Y = Y + X
id(Y) == before
before,id(Y)
(2760437537488, 2760358641424)
#这可能是不可取的,原因有两个:

#首先,我们不想总是不必要地分配内存。在机器学习中,我们可能有数百兆的参数,并且在一秒内多次更新所有参数。
#通常情况下,我们希望原地执行这些更新;如果我们不原地更新,其他引用仍然会指向旧的内存位置,这样我们的某些代码可能会无意中引用旧的参数。
#我们可以使用切片表示法将操作的结果分配给先前分配的数组,例如Y[:] = <expression>
Z = torch.zeros_like(Y)
print("id(Z):",id(Z))
Z[:] = X + Y
print("id(Z):",id(Z))
id(Z): 2760442838640
id(Z): 2760442838640
#如果在后续计算中没有重复使用X, 我们也可以使用X[:] = X + Y或X += Y来减少操作的内存开销。
before = id(X)
X += Y
id(X) == before
True

2.1.6 转换为其他python对象

#将深度学习框架定义的张量转换为NumPy张量(ndarray)很容易,反之也同样容易。
#torch张量和numpy数组将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
A = X.numpy()
B = torch.tensor(A)
type(A),type(B)
(numpy.ndarray, torch.Tensor)
#要将大小为1的张量转换为Python标量,我们可以调用item函数或Python的内置函数。
a = torch.tensor([3.5])
a,a.item(),float(a),int(a)
(tensor([3.5000]), 3.5, 3.5, 3)

#深度学习存储和操作数据的主要接口是张量(维数组)。它提供了各种功能,包括基本数学运算、广播、索引、切片、内存节省和转换其他Python对象。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ai/53179.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ai/53179.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定