IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> PyTorch随笔-5 -> 正文阅读

[人工智能]PyTorch随笔-5

一、
1.PyTorch简介
PyTorch是一个优化的张量库,2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出,它是一个基于Python的可续计算包,可使用gpu和cpu进行深度学习,此外还支持动态神经网络。
PyTorch具有以下优点:
(1)PyTorch是相当简洁且高效快速的框架。
(2)设计追求最少的封装。
(3)设计符合人类思维,它让用户尽可能地专注于实现自己的想法。
(4)与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新。
(5)PyTorch由作者亲自维护其论坛,以供用户交流和求教问题。
(6)入门简单。
1.Torch
包 torch 包含了多维张量的数据结构以及基于其上的多种数学操作。另外,它也提供了多种工具,其中一些可以更有效地对张量和任意类型进行序列化。

它有CUDA 的对应实现,可以在NVIDIA GPU上进行张量运算(计算能力>=2.0)。
1.1 张量 Tensors
1.torch.is_tensor(obj)
如果obj 是一个pytorch张量,则返回True

参数: obj (Object) – 判断对象

/usr/bin/env python3

-- coding: utf-8 --

import torch

shape=(3,2,)
x_data = torch.zeros(shape)
print(f"Tensor: \n {x_data} \n")
print(f"IsTensor: \n {torch.is_tensor(x_data)} \n")

Tensor:
tensor([[0., 0.],
[0., 0.],
[0., 0.]])

IsTensor:
True

2.torch.is_storage [source]

torch.is_storage(obj)
如何obj 是一个pytorch storage对象,则返回True

/usr/bin/env python3

-- coding: utf-8 --

import torch

shape=(3,2,)
x_data = torch.ones(shape)
print(f"Tensor: \n {x_data} \n")
print(f"is_storage: \n {torch.is_storage(x_data)} \n")

tensor([[1., 1.],
[1., 1.],
[1., 1.]])

is_storage:
False
3.
2.Tensor
2.1 概述
Tensor中文称为张量,张量(tensor)理论是数学的一个分支学科,张量在数学上定义为:它是矢量概念的推广,向量(指具有大小和方向的量)是一阶张量,是张量的特例,张量可表示的内容比向量更丰富,它可用来表示向量、标量(标量只有大小,没有方向)和其他张量之间的线性关系的多线性函数。
在PyTorch中,Tensor是一种特殊的数据结构,非常类似于数组和矩阵,它被用来编码模型的输入和输出,以及模型的参数。Tensor类似于NumPy的ndarray,但比NumPy更强大,Tensor还可以在gpu或其他硬件加速器上运行。事实上,Tensor和NumPy数组通常可以共享相同的底层内存,从而消除了复制数据的需要。张量也被优化为自动微分。

2.2 张量定义
一、创建张量
在Pytorch中创建张量的方法取决于实际应用场景,主要有以下几种方法:
1、torch.tensor函数
用预先存在的数据创建张量,可使用torch.tensor函数。函数格式如下:
torch.tensor(data, , dtype=None, device=None, requires_grad=False, pin_memory=False) → Tensor
该函数有以下几个参数。
(1)Data:表示要构造张量的数据,可以是list、tuple、NumPy ndarray、scalar和其他类型。
(2)dtype (torch.dtype,可选参数) :期望返回张量的数据类型。默认参数值为None,即:从数据推断数据类型。
(3)device (torch.device,可选参数):用于CPU的CPU张量类型或用于CUDA的CUDA张量类型,参数值由设备类型(‘cpu’或’cuda’)和可选的设备的序号组成(如果设备序号不存在,该对象将始终代表设备类型的当前设备),比如:
torch.device(‘cuda:0’)或torch.device(‘cuda’, 0)表示0号cuda设备。
torch.device(‘cpu:0’)或torch.device(‘cpu’, 0)表示0号cpu设备。
默认参数值为None,即:使用当前设备作为默认张量类型(参见torch.set_default_tensor_type())。
(4)requires_grad (bool,可选参数):autograd是否记录返回张量的操作。默认值:False。
(5)pin_memory (bool,可选参数) :返回的张量是否被分配到固定的内存中。只适用于CPU张量。默认值:False。
2、torch.
tensor 函数创建具有特定大小的张量。
3、torch.like函数创建一个与另一个张量具有相同大小(和类似类型)的张量。
4、tensor.new
函数创建与另一个张量类型相似但大小不同的张量。
5、torch.Tensor类
这不是一个函数,而是包含单一数据类型元素的多维矩阵类,是默认的tensor类(torch.FloatTensor) 的简称。前述1-4方法调用成功后返回结果都是Tensor类对象。
二、张量基本操作
下面以几个例子具体讲解张量的基本操作。
1、程序1-2-2-1.py创建了一个空tensor,为2*5的矩阵(空矩阵的元素值为未初始化状态,可理解为随机值)。
#!/usr/bin/env python3

-- coding: utf-8 --

#1-2-2-1.py
import torch
x=torch.Tensor(2,5)
print(x)
程序输出结果如下:
tensor([[3.8335e-40, 3.8338e-40, 9.1835e-41, 1.0691e+24, 4.1588e+21],
[1.8128e+34, 2.1565e+29, 8.6163e+09, 1.8004e+25, 1.8032e+22]])
2、程序1-2-2-2.py创建一个空tensor,为3*5的矩阵,并返回tensor矩阵元素数据类型为torch.float32和矩阵的类型torch.FloatTensor。
#!/usr/bin/env python3

-- coding: utf-8 --

#1-2-2-2.py
import torch
x=torch.Tensor(3,5)
print(x.dtype)
print(x.type())
程序执行结果如下:
torch.float32
torch.FloatTensor
3、程序1-2-2-3.py创建了几个空tensor,都为3*5的矩阵,然后依次输出它们元素数据类型和矩阵数据类型。
#!/usr/bin/env python3

-- coding: utf-8 --

#1-2-2-3.py
import torch
x=torch.DoubleTensor(3,5)
print(x.dtype)
print(x.type())
y=torch.BoolTensor(3,5)
print(y.dtype)
print(y.type())
程序执行结果如下:
torch.float64
torch.DoubleTensor
torch.bool
torch.BoolTensor
观察程序1-2-2-3.py及上述执行结果,不难看出:x是双精度浮点数(float64)类矩阵DoubleTensor,而是y布尔(逻辑)类矩阵BoolTensor。
4、程序1-2-2-4.py依次使用Python的列表和元组构造Tensor。
#!/usr/bin/env python3

-- coding: utf-8 --

#1-2-2-4.py
import torch
x1=torch.tensor([[10,20],[2,4]])
print(x1)
print(x1.size())
y=((11,21),(11,66))
x2=torch.tensor(y)
print(x2)
执行结果如下:
tensor([[10, 20],
[ 2, 4]])
torch.Size([2, 2])
tensor([[11, 21],
[11, 66]])
程序1-2-2-4.py首先传入列表为参数,调用torch.tensor函数定义FloatTensor类矩阵x1,并输出矩阵元素及其大小(2*2);然后传入元组y作为参数,调用torch.tensor函数定义FloatTensor类矩阵x2,并输出矩阵元素。
5、程序1-2-2-5.py依次定义双精度矩阵和整数型矩阵。
#!/usr/bin/env python3

-- coding: utf-8 --

#1-2-2-5.py
import torch
a=[[10.2,20.6],[2,4]]
x=torch.DoubleTensor(a)
print(x)
y=torch.IntTensor(a)
print(y)
b=[[1,2],[3,4]]
z=torch.IntTensor(b)
print(z)
程序运行结果如下:
tensor([[10.2000, 20.6000],
[ 2.0000, 4.0000]], dtype=torch.float64)
D:\pro\learnAIpy\src\1-2-2-5.py:8: DeprecationWarning: an integer is required (got type float). Implicit conversion to integers using int is deprecated, and may be removed in a future version of Python.
y=torch.IntTensor(a)
tensor([[10, 20],
[ 2, 4]], dtype=torch.int32)
tensor([[1, 2],
[3, 4]], dtype=torch.int32)

2.3 初始化张量
2.3.1 从数据中创建
张量可以直接从数据中创建,自动判断数据类型。
import torch
data = [[11.0, 2],[3, 44.0]]
x_data = torch.tensor(data)
print(x_data)
data = [[11, 2],[3, 44]]
x_data = torch.tensor(data)
print(x_data)
运行结果:
tensor([[11., 2.],
[ 3., 44.]])
tensor([[11, 2],
[ 3, 44]])

使用 torch.Tensor.item() 从包含单个值的张量中获取Python数,请执行以下操作:

import torch
y=torch.tensor([[1,2],[3,4]])
print(y)

print(y[1,1].item())
tensor([[1, 2],
[3, 4]])

2.3.2 从NumPy 数组创建

import torch
import numpy as np
data = [[11.0, 2],[3, 44.0]]
np_array=np.array(data)
x_np = torch.from_numpy(np_array)
print(x_np)
运行结果:
tensor([[11., 2.],
[ 3., 44.]], dtype=torch.float64)

如果有一个numpy数组并希望避免复制 ,可使用torch.as_tensor()。

import torch
import numpy as np
a = np.arange(8)
b = a.reshape(4,2)
print (b)
y=torch.torch.as_tensor(b)
print(y)
y[1][1]=55
print(y)
print(b)

[[0 1]
[2 3]
[4 5]
[6 7]]
tensor([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
tensor([[ 0, 1],
[ 2, 55],
[ 4, 5],
[ 6, 7]])
[[ 0 1]
[ 2 55]
[ 4 5]
[ 6 7]]

2.3.3 从其它tensor创建

import torch
import numpy as np
data = [[11.0, 2],[3, 44.0]]
x_data = torch.tensor(data)
print(f”Tensor: \n {x_data} \n")
运行结果:

Tensor:
tensor([[11., 2.],
[ 3., 44.]])

2.3.4 随机值创建tensor
import torch
import numpy as np
shape=(3,4,)
x_data = torch.rand(shape)
print(f"Tensor: \n {x_data} \n")
运行结果:

Tensor:
tensor([[0.5137, 0.2523, 0.4290, 0.8971],
[0.6080, 0.6341, 0.3161, 0.1189],
[0.5905, 0.0437, 0.0408, 0.5235]])

2.3.5 零矩阵、单位矩阵等

import torch
import numpy as np
shape=(3,4,)
x_data = torch.zeros(shape)
print(f"Tensor: \n {x_data} \n")
x_data = torch.ones(shape)
print(f"Tensor: \n {x_data} \n")
运行结果:
Tensor:
tensor([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])

Tensor:
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
单位矩阵
在线性代数中,n阶单位矩阵,是一个n × n 的方形矩阵,其主对角线元素为1,其余元素为0。在矩阵的乘法中,起着特殊的作用,如同数的乘法中的1,根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身。
print(torch.eye(5))#对象线为1,其余为0,单位矩阵
tensor([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
import torch
print(torch.zeros(2,3,2))
print(torch.ones(2,4))
print(torch.rand(2,3))#[0,1]随机数
print(torch.arange(2,8))#序列
print(torch.arange(2,10,3))

tensor([[[0., 0.],
[0., 0.],
[0., 0.]],

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

tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
tensor([[0.2293, 0.5129, 0.2397],
[0.3889, 0.5081, 0.4054]])
tensor([2, 3, 4, 5, 6, 7])
tensor([2, 5, 8])

2.3.6 torch数据类型

Pytorch的张量的数据类型以数值类型为主,定义了以下几种CPU张量和对应的GPU张量类型,如下表所示。
数据类型 dtype CPU张量 GPU张量
32-bit floating point torch.float32?or?torch.float torch.FloatTensor torch.cuda.FloatTensor
64-bit floating point torch.float64?or?torch.double torch.DoubleTensor torch.cuda.DoubleTensor
16-bit floating point?1 torch.float16?or?torch.half torch.HalfTensor torch.cuda.HalfTensor
16-bit floating point?2 torch.bfloat16 torch.BFloat16Tensor torch.cuda.BFloat16Tensor
32-bit complex torch.complex32
64-bit complex torch.complex64
128-bit complex torch.complex128?or?torch.cdouble
8-bit integer (unsigned) torch.uint8 torch.ByteTensor torch.cuda.ByteTensor
8-bit integer (signed) torch.int8 torch.CharTensor torch.cuda.CharTensor
16-bit integer (signed) torch.int16?or?torch.short torch.ShortTensor torch.cuda.ShortTensor
32-bit integer (signed) torch.int32?or?torch.int torch.IntTensor torch.cuda.IntTensor
64-bit integer (signed) torch.int64?or?torch.long torch.LongTensor torch.cuda.LongTensor
Boolean torch.bool torch.BoolTensor torch.cuda.BoolTensor

2.3.7 torch所在设备
torch.device是一个对象,它代表一个torch所在的设备,张量被分配在该设备里。device包含一个设备类型(‘cpu’或’cuda’)和设备类型的可选设备序号。 如果设备序号不存在,这个对象将始终代表设备类型的当前设备。

特定数据类型的tensor可以被构造,通过 torch.dtype和/或torch.device,对于构造函数或张量创建操作。

cuda0 = torch.device(‘cuda:0’)
torch.ones([2, 4], dtype=torch.float64, device=cuda0)
tensor([[ 1.0000, 1.0000, 1.0000, 1.0000],
[ 1.0000, 1.0000, 1.0000, 1.0000]], dtype=torch.float64, device=‘cuda:0’)

2.4 tensor访问与操作
2.4.1 索引和切片表示法
可以使用Python的索引和切片表示法访问和修改tensor的内容:

import torch
y=torch.tensor([[1,2],[3,4]])
print(y)
print(y[1,:])
print(y[:,0])
print(y[:,1])

tensor([[1, 2],
[3, 4]])
tensor([3, 4])
tensor([1, 3])
tensor([2, 4])

2.4.2 记录操作
可使用requires_grad=True创建张量,以便torch.autograd记录对它们的操作以进行自动区分。
import torch
x = torch.tensor([[1., 2.], [3., 4.]], requires_grad=True)
out = x.pow(2).sum()
out.backward()
print(x.grad)

tensor([[2., 4.],
[6., 8.]])
2.4.3 tensor 数据保存
每个 tensor 都有一个相关的 torch.Storage,,它保存数据。tensor类还提供了存储的多维、跨视图,并定义了对存储的数字操作。
改变tensor的方法用下划线后缀标记。例如,torch.FloatTensor.abs_()就地计算绝对值并返回修改后的张量,而torch.FloatTensor.abs_()以新的tensor张量计算结果。
改变现有的张量 torch.device 和/或torch.dtype,考虑对张量使用to()方法。
当前执行的 torch.Tensor 引入内存开销,因此在具有许多小张量tensor的应用程序中可能会导致意外的高内存使用率
二、

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-01 13:53:53  更:2022-01-01 13:56:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:02:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码