- 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)
# 没有梯度
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)