首页 > 其他分享 >机器学习——数据操作(读这一篇就够了!)

机器学习——数据操作(读这一篇就够了!)

时间:2023-10-22 16:33:08浏览次数:58  
标签:元素 机器 tensor torch 张量 就够 12 amp 一篇

为了能够完成各种数据操作,我们需要某种方法来存储和操作数据。 

首先,我们介绍维数组,也称为<strong><em>张量</em></strong>(tensor)。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架,它的<em>张量类</em><strong>(在MXNet中为<code class="docutils literal notranslate"><span class="pre">ndarray, 在PyTorch和TensorFlow中为Tensor)都与Numpy的ndarray类似。 但深度学习框架又比Numpy的ndarray多一些重要功能: 首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算; 其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。

<br data-mce-bogus="1">

下面由浅入深全面介绍对张量的一些操作(以pytorch为例)

导入torch

import torch

 

arange

可以使用 arange 创建一个行向量 x

x = torch.arange(12)
x

tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

除非额外指定,新的张量将存储在内存中,并采用基于CPU的计算。

 

shape

可以通过张量的shape属性来访问张量(沿每个轴的长度)的形状 。

x.shape
torch.Size([12])

 

numel()

获取张量中元素的总数

x.numel()

12

 

reshape

要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。

X = x.reshape(3, 4)
X
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])

 可以用x.reshape(-1,4)x.reshape(3,-1)来取代x.reshape(3,4)

 

初始化创建

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.]]])


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.]]])

 

有时我们想通过从某个特定的概率分布中随机采样来得到张量中每个元素的值。 例如,当我们构造数组来作为神经网络中的参数时,我们通常会随机初始化参数的值。 以下代码创建一个形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。

torch.randn(3, 4)
tensor([[-0.0135,  0.0665,  0.0912,  0.3212],
        [ 1.4653,  0.1843, -1.6995, -0.3036],
        [ 1.7646,  1.0450,  0.2457, -0.7732]])

 

我们还可以通过提供包含数值的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]])

 

张量运算

对于任意具有相同形状的张量, 常见的标准算术运算符(+-*/**)都可以被升级为按元素运算。 我们可以在同一形状的任意两个张量上调用按元素操作。 在下面的例子中,我们使用逗号来表示一个具有5个元素的元组,其中每个元素都是按元素操作的结果。 

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) #e^x

tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

 

 

我们也可以把多个张量连结(concatenate)在一起, 把它们端对端地叠起来形成一个更大的张量。 我们只需要提供张量列表,并给出沿哪个轴连结。 下面的例子分别演示了当我们沿行(轴-0,形状的第一个元素) 和按列(轴-1,形状的第二个元素)连结两个矩阵时,会发生什么情况。

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为例: 对于每个位置,如果XY在该位置相等,则新张量中相应项的值为1。 这意味着逻辑语句X== Y在该位置处为真,否则该位置为0。

X == Y
tensor([[False,  True, False,  True],
        [False, False, False, False],
        [False, False, False, False]])

 

对张量中的所有元素进行求和,会产生一个单元素张量。

X.sum()
tensor(66.)

 

广播机制

在某些情况下,即使形状不同,我们仍然可以通过调用 广播机制(broadcasting mechanism)来执行按元素操作。 这种机制的工作方式如下:

  1. 通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状;

  2. 对生成的数组执行按元素操作。

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
(tensor([[0],
         [1],
         [2]]),
 tensor([[0, 1]]))

 由于ab分别是和矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵广播为一个更大的矩阵,如下所示:矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。

a + b
tensor([[0, 1],
        [1, 2],
        [2, 3]])

 

索引

就像在任何其他Python数组中一样,张量中的元素可以通过索引访问。 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。

例如:我们可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:

 

除读取外,我们还可以通过指定索引来将元素写入矩阵。

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.]])

 

转化为其他对象

将深度学习框架定义的张量转换为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)

 

标签:元素,机器,tensor,torch,张量,就够,12,amp,一篇
From: https://www.cnblogs.com/yccy/p/17780630.html

相关文章

  • 【无监督机器学习】10.强化学习
    强化学习强化学习概念强化学习是一种无监督学习,它的目标是从环境中学习,以达成某种目标。强化学习的核心是奖励函数,通过与环境的交互,获得环境的反馈,从而学习到奖励函数,最终达成目标。与监督学习不同的是,强化学习并未给出正确的答案,而是根据奖励一步步学习,因此强化学习的训练过程......
  • Opencv使用与编译之第一篇
    Opencv使用与编译-Opencv安装与使用一、安装opencv直接在官网下载即可,官网链接(点击左边跳转)。可自由选择是否使用已编译好的还是自行编译。已编译好的windows版本中是使用VisualStudio2015和VisualStudio2017编译器编译的(即VC14和VC15),当然其也包含了源代码。图1下......
  • 【无监督机器学习】9.推荐系统
    推荐系统推荐系统的定义推荐系统是利用用户产生的行为数据,对用户的兴趣进行建模,从而给用户推荐可能感兴趣的物品。推荐系统的应用电商网站新闻网站流媒体平台协同过滤协同过滤是一种基于用户行为的推荐算法,它的基本思想是利用用户的历史行为数据,计算用户之间的相似度,然......
  • 钉钉群机器人消息通知和钉钉工作通知
    前言在消息通知这块,钉钉可谓是玩出了花,比如工作通知、群机器人通知,还有那万恶的Ding一下。钉钉的通知不仅花样多,而且大部分渠道都支持自定义,也即可以自定义设置发送时间、发送内容,并且还支持多种样式的消息如文本、卡片、Markdown等。这篇文章我主要介绍一下常用的两类:钉钉群机器......
  • 机器学习随笔
    Ttask 任务P performancemeasureP度量系数Eexperience经验监督学习回归与分类问题连续 离散无监督学习没有标签的分类例如新闻分类将相关的新闻都放在一起聚类算法鸡尾酒会问题麦克风中两个声音进行分离代......
  • 《动手学深度学习 Pytorch版》 9.5 机器翻译与数据集
    机器翻译(machinetranslation)指的是将序列从一种语言自动翻译成另一种语言,基于神经网络的方法通常被称为神经机器翻译(neuralmachinetranslation)。importosimporttorchfromd2limporttorchasd2l9.5.1下载和预处理数据集“Tab-delimitedBilingualSentencePairs”......
  • Linux 软连接 ln -s 简单使用看这篇就够了
    全网很多文章讲源文件和目标文件,或者target和source哪个连到哪个完全没有讲清楚,一个不小心操作失误很容易造成源数据直接丢失!!! 1ln-s/A/B 这里A和B的路径要用绝对路径,执行这个命令就是在当前目录下把B指向A,也就是A是实际存在的,B是虚拟的假的......
  • fork: retry: No child processes 在go程序中,每个程序启动64个协程会报此错误(每台机器
    解决方案:vi /etc/security/limits.d/20-nproc.conf*softnproc4096rootsoftnprocunlimited或者修改4096为unlimited......
  • 一篇文章解密如何轻松实现移动应用的电子和手绘PDF签名功能!
    对PDF文件签名是移动设备上越来越普遍的使用需求,本文将描述自动生成/“手绘”签名与如何使用DevExpressOfficeFileAPI组件来实现在.NETMAUI应用程序中快速合并签名/签名支持之间的区别。DevExpressOfficeFileAPI是一个专为C#,VB.NET和ASP.NET等开发人员提供的非可视化......
  • 《机器学习与优化》PDF高质量正版电子书
    下载:https://pan.quark.cn/s/5fb461be1a45......