Python专题, 语言

PyTorch基础(Tensor数据类型)

PyTorch的官方API为 https://pytorch.org/docs/stable/torch.html

这是之前关于TensorFlow的博文:TensorFlow基础使用TensorFlow搭建一个最简单的神经网络。由于TensorFlow 2.0版本不兼容 1.0 版本,API 稳定性差,此外目前开源社区和学术论文中使用 PyTorch 框架占主流,因此个人也转用 PyTorch。

本篇给出PyTorch中的Tensor数据类型的学习例子。求梯度和搭建神经网络等内容参考这篇:PyTorch中常用的模块、类和方法

代码如下:

"""
This code is supported by the website: https://www.guanjihuan.com
The newest version of this code is on the web page: https://www.guanjihuan.com/archives/37468
"""

import torch
import numpy as np

# Torch数据类型【和NumPy相近,但不是同一个类型】

scalar = torch.tensor(3.14) # 创建一个Torch标量
print('\nTorch标量:\n', scalar)

vector = torch.tensor([1, 2, 3]) # 创建一个Torch向量
print('\n\nTorch向量:\n', vector)

matrix = torch.tensor([[1, 2, 3], [4, 5, 6]]) # # 创建一个Torch矩阵
print('\n\nTorch矩阵:\n', matrix)

int_tensor = torch.IntTensor([2])
float_tensor = torch.FloatTensor([2])
double_tensor = torch.DoubleTensor([2])
print('\n\n')
print(int_tensor)
print(float_tensor)
print(double_tensor)
print('张量在 CPU 或 GPU :', int_tensor.device)


# Torch数据和NumPy数据的转换

numpy_array = np.arange(6).reshape((2, 3))  # NumPy数组
torch_tensor = torch.from_numpy(numpy_array)  # NumPy数组转Torch张量
numpy_array_2 = torch_tensor.numpy()  # Torch张量转NumPy数组
print('\n\n\n\nNumPy数组:\n', numpy_array)
print('\n\nNumpy数组转Torch张量:\n', torch_tensor) 
print('\n\nTorch张量转NumPy数组:\n', numpy_array_2)



# torch.from_numpy() 和 torch.tensor() 的关系【前者共享内存,后者不共享内存】
print('\n\n\n\ntorch.from_numpy() 和 torch.tensor() 的关系:')

np_array = np.array([1, 2, 3])
torch_tensor = torch.from_numpy(np_array)  # 共享内存
torch_tensor[0] = 100  # 修改Torch张量
print(np_array)  # NumPy数组也会被修改
np_array[1] = 200  # 修改NumPy数组
print(torch_tensor)  # Torch张量也会被修改

print()
np_array_2 = np.array([1, 2, 3])
torch_tensor_2 = torch.tensor(np_array_2)  # 不共享内存
torch_tensor_2[0] = 100  # 修改Torch张量
print(np_array_2)  # NumPy数组不会被修改
np_array_2[1] = 200   # 修改NumPy数组
print(torch_tensor_2)  # Torch张量不会被修改




# .numpy() 和 np.array() 的关系【前者共享内存,后者不共享内存】
print('\n\n\n\n.numpy() 和 np.array() 的关系:')

torch_tensor = torch.tensor([1, 2, 3])
numpy_array = torch_tensor.numpy()  # 共享内存
numpy_array[0] = 100  # 修改NumPy数组
print(torch_tensor)  # Torch张量会被修改
torch_tensor[1] = 200  # 修改Torch张量
print(numpy_array)   # NumPy数组也会被修改

print()
torch_tensor_2 = torch.tensor([1, 2, 3])
numpy_array_2 = np.array(torch_tensor_2)  # 不共享内存
numpy_array_2[0] = 100  # 修改NumPy数组
print(torch_tensor_2)  # Torch张量不会被修改
torch_tensor_2[1] = 200 # 修改Torch张量
print(numpy_array_2)   # NumPy数组不会被修改




# 绝对值操作

print('\n\n\n\nNumPy绝对值和Torch绝对值:')
numpy_array = [-1, -2, 1, 2]
torch_tensor = torch.tensor(numpy_array)
float_tensor = torch.FloatTensor(numpy_array)  # Torch的浮点张量
print(np.abs(numpy_array))
print(np.abs(torch_tensor))  # 不报错。numpy.abs()也可以处理tensor数据,仍然是返回Torch张量
print(np.abs(float_tensor))  # 不报错。numpy.abs()也可以处理tensor数据,仍然是返回Torch张量
print()
# print(torch.abs(numpy_array))  # 报错。torch.abs()只能处理tensor数据
print(torch.abs(torch_tensor))
print(torch.abs(float_tensor))





# 矩阵乘积操作

A = torch.tensor([[1, 2], [3, 4]])
B = torch.tensor([[5, 6], [7, 8]])
result_mm = torch.mm(A, B) # 使用torch.mm执行矩阵乘积
result_matmul = torch.matmul(A, B) # 使用torch.matmul执行矩阵乘积
print("\n\n\n\n使用torch.mm():\n", result_mm)
print("\n使用torch.matmul():\n", result_matmul)

result_np_dot = np.dot(A, B) # np.dot()也可以处理tensor数据,但这里返回的是NumPy数组格式
print('\n', type(result_np_dot))
print(result_np_dot, '\n')

# A_array = np.array([[1, 2], [3, 4]])
# B_array = np.array([[5, 6], [7, 8]])
# result_mm = torch.mm(A_array, B_array) # 报错。torch.mm只能处理tensor数据
# result_matmul = torch.matmul(A_array, B_array) #报错。torch.matmul只能处理tensor数据

运行结果:

Torch标量:
 tensor(3.1400)


Torch向量:
 tensor([1, 2, 3])


Torch矩阵:
 tensor([[1, 2, 3],
        [4, 5, 6]])



tensor([2], dtype=torch.int32)
tensor([2.])
tensor([2.], dtype=torch.float64)
张量在 CPU 或 GPU : cpu




NumPy数组:
 [[0 1 2]
 [3 4 5]]


Numpy数组转Torch张量:
 tensor([[0, 1, 2],
        [3, 4, 5]], dtype=torch.int32)


Torch张量转NumPy数组:
 [[0 1 2]
 [3 4 5]]




torch.from_numpy() 和 torch.tensor() 的关系:
[100   2   3]
tensor([100, 200,   3], dtype=torch.int32)

[1 2 3]
tensor([100,   2,   3], dtype=torch.int32)




.numpy() 和 np.array() 的关系:
tensor([100,   2,   3])
[100 200   3]

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




NumPy绝对值和Torch绝对值:
[1 2 1 2]
tensor([1, 2, 1, 2])
tensor([1., 2., 1., 2.])

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




使用torch.mm():
 tensor([[19, 22],
        [43, 50]])

使用torch.matmul():
 tensor([[19, 22],
        [43, 50]])

 <class 'numpy.ndarray'>
[[19 22]
 [43 50]]

参考资料:

[1] http://121.199.45.168:13007/01-PyTorch%E4%BD%BF%E7%94%A8/00-README.html

[2] https://mofanpy.com/tutorials/machine-learning/torch/torch-numpy

26 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code