PyTorch的官方API为 https://pytorch.org/docs/stable/torch.html。
PyTorch安装参考:https://pytorch.org/get-started/locally/。
这是之前关于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
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】