>  기사  >  백엔드 개발  >  Pytorch의 텐서 데이터 구조의 자세한 예

Pytorch의 텐서 데이터 구조의 자세한 예

WBOY
WBOY앞으로
2022-09-14 17:25:532803검색

【관련 추천: Python3 동영상 튜토리얼

torch.Tensor

torch.Tensor단일 데이터 유형 요소를 포함하는 다차원 행렬입니다. , numpy의 배열과 유사합니다.
Python의 목록 또는 시퀀스 데이터를 변환하기 위해 torch.tensor()를 사용하여 Tensor를 생성할 수 있습니다. 생성된 것은 dtype이고 기본값은 torch입니다. FloatTensor. torch.Tensor 是一种包含单一数据类型元素的多维矩阵,类似于 numpy 的 array
Tensor 可以使用 torch.tensor() 转换 Python 的 list 或序列数据生成,生成的是dtype 默认是 torch.FloatTensor

注意 torch.tensor() 总是拷贝 data。如果你有一个 Tensor data 并且仅仅想改变它的 requires_grad 属性,可用 requires_grad_() 或者 detach() 来避免拷贝。如果你有一个 numpy 数组并且想避免拷贝,请使用 torch.as_tensor()

1,指定数据类型的 Tensor 可以通过传递参数 torch.dtype 和/或者 torch.device 到构造函数生成:

注意为了改变已有的 tensor 的 torch.device 和/或者 torch.dtype, 考虑使用 to() 方法.

>>> torch.ones([2,3], dtype=torch.float64, device="cuda:0")
tensor([[1., 1., 1.],
        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
>>> torch.ones([2,3], dtype=torch.float32)
tensor([[1., 1., 1.],
        [1., 1., 1.]])

2,Tensor 的内容可以通过 Python索引或者切片访问以及修改:

>>> matrix = torch.tensor([[2,3,4],[5,6,7]])
>>> print(matrix[1][2])
tensor(7)
>>> matrix[1][2] = 9
>>> print(matrix)
tensor([[2, 3, 4],
        [5, 6, 9]])

3,使用 torch.Tensor.item() 或者 int() 方法从只有一个值的 Tensor中获取 Python Number:

>>> x = torch.tensor([[4.5]])
>>> x
tensor([[4.5000]])
>>> x.item()
4.5
>>> int(x)
4

4,Tensor可以通过参数 requires_grad=True 创建, 这样 torch.autograd 会记录相关的运算实现自动求导:

>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
>>> out = x.pow(2).sum()
>>> out.backward()
>>> x.grad
tensor([[ 2.0000, -2.0000],
 [ 2.0000,  2.0000]])

5,每一个 tensor都有一个相应的 torch.Storage 保存其数据。tensor 类提供了一个多维的、strided 视图, 并定义了数值操作。

Tensor 数据类型

Torch 定义了七种 CPU tensor 类型和八种 GPU tensor 类型:

Pytorch의 텐서 데이터 구조의 자세한 예

torch.Tensor 是默认的 tensor 类型(torch.FloatTensor)的简称,即 32 位浮点数数据类型。

Tensor 的属性

Tensor 有很多属性,包括数据类型、Tensor 的维度、Tensor 的尺寸。

  • 数据类型:可通过改变 torch.tensor() 方法的 dtype 参数值,来设定不同的 tensor 数据类型。
  • 维度:不同类型的数据可以用不同维度(dimension)的张量来表示。标量为 0 维张量,向量为 1 维张量,矩阵为 2 维张量。彩色图像有 rgb 三个通道,可以表示为 3 维张量。视频还有时间维,可以表示为 4 维张量,有几个中括号 [ 维度就是几。可使用 dim() 方法 获取 tensor 的维度。
  • 尺寸:可以使用 shape属性或者 size()方法查看张量在每一维的长度,可以使用 view()方法或者reshape() 方法改变张量的尺寸。

样例代码如下:

matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]],
                       [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64)
print(matrix)               # 打印 tensor
print(matrix.dtype)     # 打印 tensor 数据类型
print(matrix.dim())     # 打印 tensor 维度
print(matrix.size())     # 打印 tensor 尺寸
print(matrix.shape)    # 打印 tensor 尺寸
matrix2 = matrix.view(4, 2, 2) # 改变 tensor 尺寸
print(matrix2)

程序输出结果如下:

Pytorch의 텐서 데이터 구조의 자세한 예


view 和 reshape 的区别

两个方法都是用来改变 tensor 的 shape,view() 只适合对满足连续性条件(contiguous)的 tensor 进行操作,而 reshape() 同时还可以对不满足连续性条件的 tensor 进行操作。在满足 tensor 连续性条件(contiguous)时,a.reshape() 返回的结果与a.view() 相同,都不会开辟新内存空间;不满足 contiguous 时, 直接使用 view() 方法会失败,reshape() 依然有用,但是会重新开辟内存空间,不与之前的 tensor 共享内存,即返回的是 ”副本“(等价于先调用 contiguous() 方法再使用 view() 方法)。
更多理解参考这篇文章

Tensor 与 ndarray

1,张量和 numpy 数组。可以用 .numpy() 方法从 Tensor 得到 numpy 数组,也可以用 torch.from_numpy 从 numpy 数组得到Tensor。这两种方法关联的 Tensor 和 numpy 数组是共享数据内存的。可以用张量的 clone方法拷贝张量,中断这种关联。

arr = np.random.rand(4,5)
print(type(arr))
tensor1 = torch.from_numpy(arr)
print(type(tensor1))
arr1 = tensor1.numpy()
print(type(arr1))
"""
<class &#39;numpy.ndarray&#39;>
<class &#39;torch.Tensor&#39;>
<class &#39;numpy.ndarray&#39;>
"""

2,item() 方法和 tolist()

torch.tensor()는 항상 데이터를 복사한다는 점에 유의하세요. Tensor 데이터가 있고 requires_grad 속성만 변경하려는 경우 requires_grad_() 또는 detach()를 사용하여 복사를 방지하세요. numpy 배열이 있고 복사를 방지하려면 torch.as_tensor()를 사용하세요. 🎜
🎜1 지정된 데이터 유형의 Tensor는 torch.dtype 및/또는 torch.device 매개변수를 생성자에 전달하여 생성할 수 있습니다. 🎜🎜 기존 텐서의 torch.device 및/또는 torch.dtype을 변경하려면 to() 메서드 사용을 고려하세요.🎜
# item方法和tolist方法可以将张量转换成Python数值和数值列表
scalar = torch.tensor(5)  # 标量
s = scalar.item()
print(s)
print(type(s))

tensor = torch.rand(3,2)  # 矩阵
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class &#39;float&#39;>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class &#39;list&#39;>
"""
🎜2. Tensor의 데이터는 Python Access를 통해 인덱싱하거나 슬라이스할 수 있으며 다음과 같이 수정할 수 있습니다. 🎜
>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
🎜3, torch.Tensor.item() 또는 int() 메서드 사용 Strong>값이 하나만 있는 Tensor Python 번호 가져오기: 🎜rrreee🎜4, Tensor는 requires_grad=True 매개변수를 사용하여 생성할 수 있으므로 torch.autograd 자동 파생을 달성하기 위해 관련 작업을 기록합니다: 🎜rrreee🎜5 , 각 텐서에는 데이터를 저장하기 위한 해당 torch.Storage가 있습니다. 텐서 클래스는 다차원적인 스트라이드 뷰를 제공하고 수치 연산을 정의합니다. 🎜🎜Tensor 데이터 유형🎜🎜Torch는 7개의 CPU 텐서 유형과 8개의 GPU 텐서 유형을 정의합니다. 🎜

tensor data type🎜🎜torch.Tensor는 기본 텐서 유형입니다(torch.FloatTensor ), 즉 <code>32 비트 부동 소수점 데이터 유형입니다. 🎜🎜Tensor의 속성🎜🎜Tensor에는 데이터 유형, Tensor 차원 및 Tensor 크기를 포함한 많은 속성이 있습니다. 🎜

  • 데이터 유형: torch.tensor() 메소드의 dtype 매개변수 값을 변경하여 다양한 텐서 데이터 유형을 설정할 수 있습니다.
  • 차원: 다양한 유형의 데이터를 다양한 차원의 텐서로 표현할 수 있습니다. 스칼라는 0차원 텐서, 벡터는 1차원 텐서, 행렬은 2차원 텐서입니다. 컬러 이미지는 RGB, 3개의 채널을 가지며 3차원 텐서로 표현될 수 있습니다. 비디오에도 시간 차원이 있는데, 이는 여러 개의 대괄호가 포함된 4차원 텐서로 표현될 수 있습니다. [차원은 몇 개입니다. 텐서의 차원은 Dim() 메서드를 사용하여 얻을 수 있습니다.
  • 크기: 텐서의 각 차원의 길이를 보려면 Shape 속성이나 size() 메서드를 사용할 수 있으며, view() 메서드나 reshape() 메서드를 사용하여 크기를 변경할 수 있습니다. 텐서의 크기.
🎜샘플 코드는 다음과 같습니다: 🎜rrreee🎜프로그램 출력은 다음과 같습니다: 🎜

tensor attribute🎜


🎜🎜보기와 모양 변경의 차이점🎜 🎜두 방법 모두 동일합니다. 텐서의 모양을 변경하는 데 사용됩니다. view()는 연속성 조건(인접)을 충족하는 텐서를 작동하는 데만 적합하지만 reshape()도 작동할 수 있습니다. 연속성 조건을 충족하지 않는 텐서. 텐서 연속성 조건(연속)이 충족되면 a.reshape()에서 반환된 결과는 a.view()와 동일하며 인 경우 새 메모리 공간이 열리지 않습니다. 연속적인이 충족되지 않으면, view() 메서드를 직접 사용하는 것은 실패합니다. reshape()는 여전히 유용하지만 메모리 공간을 다시 열고 공유하지 않습니다. 즉, "" "의 복사본을 반환합니다(contiguous() 메서드를 먼저 호출한 다음 뷰를 사용하는 것과 같습니다). () 메소드).
더 자세한 내용은 이 기사🎜🎜Tensor 및 ndarray🎜🎜1, tensor 및 numpy 배열을 참조하세요. .numpy() 메서드를 사용하여 Tensor에서 numpy 배열을 가져오거나 torch.from_numpy를 사용하여 numpy 배열에서 Tensor를 가져올 수 있습니다. 이 두 가지 방법과 관련된 Tensor 및 numpy 배열은 데이터 메모리를 공유합니다. 텐서의 clone 메소드를 사용하여 텐서를 복사하고 이 연결을 끊을 수 있습니다. 🎜rrreee🎜2, item() 메서드와 tolist() 메서드는 텐서를 Python 숫자와 숫자 목록으로 변환할 수 있습니다🎜

# item方法和tolist方法可以将张量转换成Python数值和数值列表
scalar = torch.tensor(5)  # 标量
s = scalar.item()
print(s)
print(type(s))

tensor = torch.rand(3,2)  # 矩阵
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class &#39;float&#39;>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class &#39;list&#39;>
"""

创建 Tensor

创建 tensor ,可以传入数据或者维度,torch.tensor() 方法只能传入数据,torch.Tensor() 方法既可以传入数据也可以传维度,强烈建议 tensor() 传数据,Tensor() 传维度,否则易搞混。

传入维度的方法

方法名 方法功能 备注
torch.rand(*sizes, out=None) → Tensor 返回一个张量,包含了从区间 [0, 1)均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。 推荐
torch.randn(*sizes, out=None) → Tensor 返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。 不推荐
torch.normal(means, std, out=None) → Tensor 返回一个张量,包含了从指定均值 means 和标准差 std 的离散正态分布中抽取的一组随机数。标准差 std 是一个张量,包含每个输出元素相关的正态分布标准差。 多种形式,建议看源码
torch.rand_like(a) 根据数据 a 的 shape 来生成随机数据 不常用
torch.randint(low=0, high, size) 生成指定范围(low, hight)和 size 的随机整数数据 常用
torch.full([2, 2], 4) 生成给定维度,全部数据相等的数据 不常用
torch.arange(start=0, end, step=1, *, out=None) 生成指定间隔的数据 易用常用
torch.ones(*size, *, out=None) 生成给定 size 且值全为1 的矩阵数据 简单
zeros()/zeros_like()/eye() 0 的 tensor 和 对角矩阵 简单

样例代码:

>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

【相关推荐:Python3视频教程

위 내용은 Pytorch의 텐서 데이터 구조의 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제