• 引用地址
- https://www.cnblogs.com/kiba/p/18346596
  • 名词解释
- vector: 向量(只有一行 || 一列的矩阵)
	- 例如: 1,1,0
	
- tensor: 张量(多行多列的矩阵,叫二维张量---tensor2D)
	- 例如: 1,1,0
		   1,0,1
	- 三维张量(tensor3D),就是三维数组
		   
- gradient: 梯度(求偏导数)
- derivative: 导数

- 矩阵: 就是'表'
  • 基础实例
import torch
import numpy as np

# 创建一个只有一个元素(只有一行)的向量(vector),元素值是未定义的,未定义的就是0,打印出来是[0.],这是因为默认的元素类型是float32
# x = torch.empty(1)

# 创建一个有三个元素的向量(vector),结果 [0,0,0]
# x = torch.empty(3)

# 创建了一个形状为 (3, 2) 的张量(矩阵)(三行两列)[随机值]
'''
tensor([[2.9307e-03, 1.8343e-42],
        [0.0000e+00, 0.0000e+00],
        [0.0000e+00, 0.0000e+00]])
'''
# x = torch.empty(3,2)

# 创建了一个三行两列的矩阵[随机值]
'''
tensor([[0.9680, 0.5390],
        [0.0769, 0.8145],
        [0.9736, 0.3535]])
'''
# x = torch.rand(3,2)

# 创建了一个三行两列的矩阵,并赋值0
'''
tensor([[0., 0.],
        [0., 0.],
        [0., 0.]])
'''
# x = torch.zeros(3,2)

# 创建了一个两行两列的矩阵,并赋值1
'''
tensor([[1., 1.],
        [1., 1.]])
'''
# x = torch.ones(2,2)
# print(x)
# # torch.float32(默认的数据类型)
# print(x.dtype)

'''
tensor([[1, 1, 1],
        [1, 1, 1],
        [1, 1, 1]], dtype=torch.int32)
'''
#  创建一个3*3的矩阵,结果不带.了
# x = torch.ones(3,3,dtype=torch.int)
# 结果又带.
# x = torch.ones(3,3,dtype=torch.double)
# print(x)
# # 返回矩阵的尺寸: torch.Size([3, 3])
# print(x.size())
# # 返回矩阵的元素个数: 9
# print(x.size().numel())

# 声明一个一维张量:tensor([2.0000, 2.0000, 3.1000])
# x = torch.tensor([2,2,3.1])
# print(x)

# x = torch.ones(3,3,dtype=torch.int)
# print(x)
# y = torch.ones(3,3,dtype=torch.int)
# print(y)
# z = x + y
# print(z)
# '''
# tensor([[1, 1, 1],
#         [1, 1, 1],
#         [1, 1, 1]], dtype=torch.int32)
# tensor([[1, 1, 1],
#         [1, 1, 1],
#         [1, 1, 1]], dtype=torch.int32)
# tensor([[2, 2, 2],
#         [2, 2, 2],
#         [2, 2, 2]], dtype=torch.int32)
# '''
# print(y.add(x))
# z = x - y
# print(z)
# '''
# tensor([[2, 2, 2],
#         [2, 2, 2],
#         [2, 2, 2]], dtype=torch.int32)
# tensor([[0, 0, 0],
#         [0, 0, 0],
#         [0, 0, 0]], dtype=torch.int32)
# '''

# # 创建5列4行的矩阵(随机值)
# x = torch.rand(5,4)
# print(x)
# # 打印全部行,但只取第一列
# print(x[:,0])
# # 打印全部列,但只取第一行
# print(x[0,:])
# # 打印第1行,第1列的值
# print(x[0,0])
# # 打印第2行,第2列的值(并转换成python类型[原本是'张量'类型])
# print(x[1,1].item())
'''
tensor([[0.3017, 0.2744, 0.5647, 0.0398],
        [0.8390, 0.5884, 0.0838, 0.5318],
        [0.5443, 0.0571, 0.3018, 0.5802],
        [0.7529, 0.4711, 0.7307, 0.7469],
        [0.2973, 0.3721, 0.8305, 0.3118]])
        
tensor([0.3017, 0.8390, 0.5443, 0.7529, 0.2973])

tensor([0.3017, 0.2744, 0.5647, 0.0398])

tensor(0.3017)

0.5883817076683044

'''
# # 生成5行4列的矩阵(总共20个元素)
# x = torch.rand(5,4)
# # 将张量 x 的形状变换为 (20),即一个一维张量,包含 x 中的所有元素
# y = x.view(20)
# print(x)
# print(y)
# # -1 表示让 PyTorch 自动计算合适的值使得元素总数不变。在这个例子中,-1 会被自动计算为 2,因此张量 y 的形状将是 (2, 10)。
# y = x.view(-1,10)
# print(y)
# print(y.size())
# print(y.size().numel())
'''
tensor([[0.4213, 0.2931, 0.0566, 0.3795],
        [0.9692, 0.7676, 0.7290, 0.6796],
        [0.3532, 0.3062, 0.7915, 0.4825],
        [0.1499, 0.9031, 0.9805, 0.9133],
        [0.6641, 0.0448, 0.8334, 0.0433]])
        
tensor([0.4213, 0.2931, 0.0566, 0.3795, 0.9692, 0.7676, 0.7290, 0.6796, 0.3532,
        0.3062, 0.7915, 0.4825, 0.1499, 0.9031, 0.9805, 0.9133, 0.6641, 0.0448,
        0.8334, 0.0433])
        
tensor([[0.4213, 0.2931, 0.0566, 0.3795, 0.9692, 0.7676, 0.7290, 0.6796, 0.3532,
         0.3062],
        [0.7915, 0.4825, 0.1499, 0.9031, 0.9805, 0.9133, 0.6641, 0.0448, 0.8334,
         0.0433]])
         
torch.Size([2, 10])

20
'''

# x = torch.ones(5)
# # 转换类型
# y = x.numpy()
# # <class 'torch.Tensor'> [1. 1. 1. 1. 1.] <class 'numpy.ndarray'>
# print(type(x),y,type(y))
#
# # x和y是对象封装,引用地址一样 所以当我们给x+1时,y也会+1
# x.add_(1)
# print(x)
# print(y)
'''
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
'''

# 从numpy.ndarray转成tensor张量的方式
# x = np.ones(5)
# y = torch.from_numpy(x)
# x += 1
# print(x)
# print(y)

'''
这段代码创建了一个一维张量 x,并对其进行了一系列数学运算,包括加法、乘法以及平方等操作,最后计算了这些运算结果的平均值
并通过调用 backward() 函数计算了从 x 到 out 的梯度
通过这种方式,我们可以了解如何在 PyTorch 中处理简单的前向传播和反向传播流程

tensor([1., 1., 1., 1., 1.], requires_grad=True)
tensor([3., 3., 3., 3., 3.], grad_fn=<AddBackward0>)
tensor([27., 27., 27., 27., 27.], grad_fn=<MulBackward0>)
tensor(27., grad_fn=<MeanBackward0>)
tensor([3.6000, 3.6000, 3.6000, 3.6000, 3.6000])

'''
# x = torch.ones(5,requires_grad=True)
# print(x)
# y = x + 2
# print(y)
# z = y * y * 3
# print(z)
# out = z.mean()
# print(out)
# out.backward()
# print(x.grad)

x = torch.tensor([1.0,2.0,3.0],requires_grad=True)
y = x.pow(2).sum()
y.backward()
print(x.grad)
  • Gradient: 梯度
# 没有梯度
a = torch.randn(3)
print(a)
b = a + 2
print(b)

# 有梯度
x = torch.randn(3,requires_grad=True)
print(x)
y = x + 2
print(y)

'''
tensor([ 1.1229, -0.4957, -1.0993])
tensor([3.1229, 1.5043, 0.9007])
tensor([-0.1258,  1.8161, -0.8597], requires_grad=True)
tensor([1.8742, 3.8161, 1.1403], grad_fn=<AddBackward0>)
'''
import torch

# 创建一个形状为 (3,) 的随机张量 x,且需要跟踪其上的所有操作
x = torch.randn(3, requires_grad=True)
print("x:", x)

# 计算 y = x + 2
y = x + 2
print("y:", y)

# 计算 z = (y * y) * 2
z = y * y * 2
print("z before mean:", z)

# 计算 z 的平均值
z = z.mean()
print("z after mean:", z)

# 执行反向传播
z.backward()

# 打印 x 的梯度
print("x.grad:", x.grad)

'''

- 可能的输出结果:

        x: tensor([1.0000, 2.0000, 3.0000], requires_grad=True)
        y: tensor([3.0000, 4.0000, 5.0000], grad_fn=<AddBackward0>)
        z before mean: tensor([18.0000, 32.0000, 50.0000], grad_fn=<MulBackward0>)
        z after mean: tensor(33.3333, grad_fn=<MeanBackward0>)
        x.grad: tensor([12.0000, 16.0000, 20.0000])
        
'''
import torch

# 创建一个形状为 (4,) 的张量 weights,所有元素都初始化为 1,且需要跟踪其上的所有操作
weights = torch.ones(4, requires_grad=True)
print("Initial weights:", weights)

# 进行 3 轮训练
for epoch in range(3):
    # 计算模型输出
    model_output = (weights * 3).sum()
    
    # 执行反向传播
    model_output.backward()
    
    # 打印梯度
    print(f"Epoch {epoch + 1} gradients:", weights.grad)
    
    # 重置梯度(梯度清零)
    weights.grad.zero_()
    
'''
    Initial weights: tensor([1., 1., 1., 1.], requires_grad=True)
    Epoch 1 gradients: tensor([3., 3., 3., 3.])
    Epoch 2 gradients: tensor([3., 3., 3., 3.])
    Epoch 3 gradients: tensor([3., 3., 3., 3.])

- 如果注释掉 weights.grad.zero_(),那么输出结果是:

    tensor([1., 1., 1., 1.], requires_grad=True)
    tensor([3., 3., 3., 3.])
    tensor([6., 6., 6., 6.])
    tensor([9., 9., 9., 9.])

'''
import torch

# 创建一个形状为 (3,) 的随机张量 x,且需要跟踪其上的所有操作
x = torch.randn(3, requires_grad=True)
print("x:", x)

# 计算 y = x + 2
y = x + 2
print("y:", y)

# 计算 z = (y * y) * 2
z = y * y * 2
print("z:", z)

# 创建一个形状为 (3,) 的张量 v
v = torch.tensor([1.0, 2.0, 3.0], dtype=torch.float32)
print("v:", v)

# 执行反向传播(加权)
z.backward(v)

# 打印 x 的梯度
print("x.grad:", x.grad)