小白入门pytorch 基础知识
import torch
print(torch.__version__)
输出结果:
1.12.1+cu113
在pytorch中,张量(tensor)是最基本的数据结构。
tensor = torch.tensor(10)
print("tensor的形状", tensor.shape)
print("tensor的值", tensor)
输出结果:
tensor的形状 torch.Size([])
tensor的值 tensor(10)
tensor = torch.tensor([1, 2, 3, 4, 5])
print("tensor的形状", tensor.shape)
print("tensor的值", tensor)
输出结果:
tensor的形状 torch.Size([5])
tensor的值 tensor([1, 2, 3, 4, 5])
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])
print("tensor的形状", tensor.shape)
print( tensor)
输出结果:
tensor的形状 torch.Size([2, 3])
tensor([[1, 2, 3],
[4, 5, 6]])
torch.Size([2, 3])中的[2, 3]是代表2行,3列
tensor = torch.tensor([[[1, 2],[3, 4]], [[5, 6],[7, 8]]])
print(tensor.shape)
print(tensor)
输出结果:
torch.Size([2, 2, 2])
tensor([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
torch.Size([2, 2, 2]):包含两个二维矩阵,每个二维矩阵的形状是2行2列
tensor = torch.tensor([1, 2])
tensor
输入结果:
tensor([1, 2])
tensor = torch.tensor((1, 2))
tensor
输出结果:
tensor([1, 2])
import numpy as np
data = np.array([1, 2])
tensor = torch.tensor(data)
tensor
输出结果:
tensor([1, 2], dtype=torch.int32)
tensor = torch.tensor([1, 2, 3], dtype=torch.float32)
print(tensor)
print(tensor.dtype)
输出结果:
tensor([1., 2., 3.])
torch.float32
zeros_tensor = torch.zeros([2, 3]) # 创建一个2行3列的全零张量
print(zeros_tensor.shape)
zeros_tensor
输出结果:
torch.Size([2, 3])
tensor([[0., 0., 0.],
[0., 0., 0.]])
torch.zeros()全零张量的函数
ones_tensor = torch.ones((2, 3)) # 创建一个2行3列的全1张量
print(ones_tensor.shape)
ones_tensor
输出结果:
torch.Size([2, 3])
tensor([[1., 1., 1.],
[1., 1., 1.]])
torch.ones()全1张量的函数
rand_tensor = torch.rand((2, 3)) # 创建一个2行3列随机张量, torch.rand()函数将生成一个(0,1)范围内均匀分布的随机张量
print(rand_tensor.shape)
print(rand_tensor)
输出结果:
torch.Size([2, 3])
tensor([[0.4723, 0.6665, 0.7575],
[0.8820, 0.1854, 0.1162]])
tensor = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
print(tensor)
输出结果:
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 访问第一个元素
print(tensor[0, 0])
# 切片操作
tensor[:, 1] # 逗号两边的数字,左边是控制行,右边是控制列
输出结果:
tensor([2, 5, 8])
# 取第一行和第三行的第一列和第三列的元素
tensor[::2, ::2]
输出结果:
tensor([[1, 3],
[7, 9]])
# 创建一个形状为(2, 2)的张量
tensor = torch.tensor([[1, 2], [3, 4]])
tensor = tensor.to('cuda') # 将张量转移到gpu上
tensor
输出结果:
tensor([[1, 2],
[3, 4]], device='cuda:0')
tensor = tensor.to('cpu')
print(tensor)
输出结果:
tensor([[1, 2],
[3, 4]])
# 创建两个张量
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([3, 3, 3])
# 加法
result = tensor1 + tensor2
print("加法的结果", result)
# 减法
result = tensor1 - tensor2
print("减法的结果", result)
# 乘法
result = tensor1 * tensor2
print("乘法的结果", result)
# 除法
result = tensor1 / tensor2
print("除法的结果", result)
加法的结果 tensor([4, 5, 6])
减法的结果 tensor([-2, -1, 0])
乘法的结果 tensor([3, 6, 9])
除法的结果 tensor([0.3333, 0.6667, 1.0000])
# 张量与标量相加
tensor1 = torch.tensor([1, 2, 3])
temp_var = 1
result = tensor1 + temp_var
print("张量与标量相加结果", result)
# 张量与标量相乘
tensor1 = torch.tensor([1, 2, 3])
temp_var = 2
result = tensor1 * temp_var
print("张量与标量相乘结果", result)
输出结果:
张量与标量相加结果 tensor([2, 3, 4])
张量与标量相乘结果 tensor([2, 4, 6])
tensor = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 2行3列
print("原来的张量\n",tensor)
tensor = tensor.reshape(3, 2) # 3行2列
print("变换后的张量\n", tensor)
输出结果:
原来的张量
tensor([[1, 2, 3],
[4, 5, 6]])
变换后的张量
tensor([[1, 2],
[3, 4],
[5, 6]])
# 改变张量的形状(与reshape功能相同)
tensor = torch.tensor([[1, 2, 3],[4, 5, 6]]) # 2行3列
print("原来的张量\n", tensor)
tensor = tensor.view(3, 2) # 3行2列
print("变换后的向量\n", tensor)
原来的张量
tensor([[1, 2, 3],
[4, 5, 6]])
变换后的向量
tensor([[1, 2],
[3, 4],
[5, 6]])
tensor = torch.randn(1) # 如果张量中仅有一个元素,可用item
print(tensor)
print(tensor.item())
输出结果:
tensor([-0.5515])
-0.5514923930168152
tensor = torch.tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
array = tensor.numpy() # 将张量转化为Numpy数组
print(array)
输出结果:
[[1 2 3]
[4 5 6]
[7 8 9]]
tensor = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 将张量转化为列表
tensor_list = tensor.tolist()
tensor_list
输出结果:
[[1, 2, 3], [4, 5, 6]]
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x**2 + 3*x + 1
y.sum().backward()
print(x.grad)
输出结果:
tensor([7., 9.])
import torch
# 创建训练数据
x_train = torch.tensor([[1.0], [2.0], [3.0]])
y_train = torch.tensor([[2.0], [4.0], [6.0]])
#定义模型参数
w = torch.tensor([[0.0]], requires_grad=True)
b = torch.tensor([[0.0]], requires_grad=True)
# 定义模型
def linear_regression(x):
return torch.matmul(x, w) + b
# 定义损失函数
def loss_fn(y_pred, y):
return torch.mean((y_pred - y)**2)
# 优化器
optimizer = torch.optim.SGD([w, b], lr=0.01)
# 训练模型
for epoch in range(100):
# 前向传播
y_pred = linear_regression(x_train)
# 计算损失
loss = loss_fn(y_pred, y_train)
print(loss)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 清零梯度
optimizer.zero_grad()
打印loss的结果看一下
tensor(18.6667, grad_fn=<MeanBackward0>)
tensor(14.7710, grad_fn=<MeanBackward0>)
tensor(11.6915, grad_fn=<MeanBackward0>)
tensor(9.2573, grad_fn=<MeanBackward0>)
tensor(7.3332, grad_fn=<MeanBackward0>)
tensor(5.8121, grad_fn=<MeanBackward0>)
tensor(4.6098, grad_fn=<MeanBackward0>)
tensor(3.6593, grad_fn=<MeanBackward0>)
tensor(2.9079, grad_fn=<MeanBackward0>)
tensor(2.3139, grad_fn=<MeanBackward0>)
tensor(1.8443, grad_fn=<MeanBackward0>)
tensor(1.4730, grad_fn=<MeanBackward0>)
tensor(1.1795, grad_fn=<MeanBackward0>)
tensor(0.9474, grad_fn=<MeanBackward0>)
tensor(0.7639, grad_fn=<MeanBackward0>)
tensor(0.6187, grad_fn=<MeanBackward0>)
tensor(0.5039, grad_fn=<MeanBackward0>)
tensor(0.4131, grad_fn=<MeanBackward0>)
tensor(0.3412, grad_fn=<MeanBackward0>)
tensor(0.2844, grad_fn=<MeanBackward0>)
tensor(0.2393, grad_fn=<MeanBackward0>)
tensor(0.2037, grad_fn=<MeanBackward0>)
tensor(0.1754, grad_fn=<MeanBackward0>)
tensor(0.1530, grad_fn=<MeanBackward0>)
tensor(0.1352, grad_fn=<MeanBackward0>)
tensor(0.1211, grad_fn=<MeanBackward0>)
tensor(0.1099, grad_fn=<MeanBackward0>)
tensor(0.1009, grad_fn=<MeanBackward0>)
tensor(0.0938, grad_fn=<MeanBackward0>)
tensor(0.0881, grad_fn=<MeanBackward0>)
tensor(0.0835, grad_fn=<MeanBackward0>)
tensor(0.0798, grad_fn=<MeanBackward0>)
tensor(0.0769, grad_fn=<MeanBackward0>)
tensor(0.0744, grad_fn=<MeanBackward0>)
tensor(0.0724, grad_fn=<MeanBackward0>)
tensor(0.0708, grad_fn=<MeanBackward0>)
tensor(0.0695, grad_fn=<MeanBackward0>)
tensor(0.0683, grad_fn=<MeanBackward0>)
tensor(0.0674, grad_fn=<MeanBackward0>)
tensor(0.0665, grad_fn=<MeanBackward0>)
tensor(0.0658, grad_fn=<MeanBackward0>)
tensor(0.0652, grad_fn=<MeanBackward0>)
tensor(0.0646, grad_fn=<MeanBackward0>)
tensor(0.0641, grad_fn=<MeanBackward0>)
tensor(0.0637, grad_fn=<MeanBackward0>)
tensor(0.0632, grad_fn=<MeanBackward0>)
tensor(0.0628, grad_fn=<MeanBackward0>)
tensor(0.0625, grad_fn=<MeanBackward0>)
tensor(0.0621, grad_fn=<MeanBackward0>)
tensor(0.0618, grad_fn=<MeanBackward0>)
tensor(0.0614, grad_fn=<MeanBackward0>)
tensor(0.0611, grad_fn=<MeanBackward0>)
tensor(0.0608, grad_fn=<MeanBackward0>)
tensor(0.0605, grad_fn=<MeanBackward0>)
tensor(0.0602, grad_fn=<MeanBackward0>)
tensor(0.0599, grad_fn=<MeanBackward0>)
tensor(0.0596, grad_fn=<MeanBackward0>)
tensor(0.0593, grad_fn=<MeanBackward0>)
tensor(0.0590, grad_fn=<MeanBackward0>)
tensor(0.0587, grad_fn=<MeanBackward0>)
tensor(0.0584, grad_fn=<MeanBackward0>)
tensor(0.0581, grad_fn=<MeanBackward0>)
tensor(0.0578, grad_fn=<MeanBackward0>)
tensor(0.0576, grad_fn=<MeanBackward0>)
tensor(0.0573, grad_fn=<MeanBackward0>)
tensor(0.0570, grad_fn=<MeanBackward0>)
tensor(0.0567, grad_fn=<MeanBackward0>)
tensor(0.0565, grad_fn=<MeanBackward0>)
tensor(0.0562, grad_fn=<MeanBackward0>)
tensor(0.0559, grad_fn=<MeanBackward0>)
tensor(0.0557, grad_fn=<MeanBackward0>)
tensor(0.0554, grad_fn=<MeanBackward0>)
tensor(0.0551, grad_fn=<MeanBackward0>)
tensor(0.0549, grad_fn=<MeanBackward0>)
tensor(0.0546, grad_fn=<MeanBackward0>)
tensor(0.0543, grad_fn=<MeanBackward0>)
tensor(0.0541, grad_fn=<MeanBackward0>)
tensor(0.0538, grad_fn=<MeanBackward0>)
tensor(0.0536, grad_fn=<MeanBackward0>)
tensor(0.0533, grad_fn=<MeanBackward0>)
tensor(0.0530, grad_fn=<MeanBackward0>)
tensor(0.0528, grad_fn=<MeanBackward0>)
tensor(0.0525, grad_fn=<MeanBackward0>)
tensor(0.0523, grad_fn=<MeanBackward0>)
tensor(0.0520, grad_fn=<MeanBackward0>)
tensor(0.0518, grad_fn=<MeanBackward0>)
tensor(0.0515, grad_fn=<MeanBackward0>)
tensor(0.0513, grad_fn=<MeanBackward0>)
tensor(0.0510, grad_fn=<MeanBackward0>)
tensor(0.0508, grad_fn=<MeanBackward0>)
tensor(0.0505, grad_fn=<MeanBackward0>)
tensor(0.0503, grad_fn=<MeanBackward0>)
tensor(0.0501, grad_fn=<MeanBackward0>)
tensor(0.0498, grad_fn=<MeanBackward0>)
tensor(0.0496, grad_fn=<MeanBackward0>)
tensor(0.0493, grad_fn=<MeanBackward0>)
tensor(0.0491, grad_fn=<MeanBackward0>)
tensor(0.0489, grad_fn=<MeanBackward0>)
tensor(0.0486, grad_fn=<MeanBackward0>)
tensor(0.0484, grad_fn=<MeanBackward0>)
import torch
import torch.nn as nn
import torch.optim as optim
class LinearRegression(nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = nn.Linear(1, 1) # 输入维度为1, 输出维度为1
def forward(self, x):
return self.linear(x)
# 创建模型的实例、定义损失函数和优化器
model = LinearRegression()
criterion = nn.MSELoss() # 均方误差损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 生成样本数据,并进行训练
x_train = torch.tensor([[1.0],[2.0],[3.0],[4.0]])
y_train = torch.tensor([[2.0],[4.0],[6.0],[8.0]])
# 训练模型
for epoch in range(100):
# 梯度清零
optimizer.zero_grad()
# 前向传播
y_pred = model(x_train)
# 计算损失
loss = criterion(y_pred, y_train)
# 反向传播
loss.backward()
# 参数更新
optimizer.step()
print(loss)
输出损失值:
tensor(30.6108, grad_fn=<MseLossBackward0>)
tensor(21.2626, grad_fn=<MseLossBackward0>)
tensor(14.7759, grad_fn=<MseLossBackward0>)
tensor(10.2748, grad_fn=<MseLossBackward0>)
tensor(7.1515, grad_fn=<MseLossBackward0>)
tensor(4.9841, grad_fn=<MseLossBackward0>)
tensor(3.4801, grad_fn=<MseLossBackward0>)
tensor(2.4364, grad_fn=<MseLossBackward0>)
tensor(1.7120, grad_fn=<MseLossBackward0>)
tensor(1.2093, grad_fn=<MseLossBackward0>)
tensor(0.8603, grad_fn=<MseLossBackward0>)
tensor(0.6181, grad_fn=<MseLossBackward0>)
tensor(0.4498, grad_fn=<MseLossBackward0>)
tensor(0.3330, grad_fn=<MseLossBackward0>)
tensor(0.2518, grad_fn=<MseLossBackward0>)
tensor(0.1953, grad_fn=<MseLossBackward0>)
tensor(0.1560, grad_fn=<MseLossBackward0>)
tensor(0.1286, grad_fn=<MseLossBackward0>)
tensor(0.1095, grad_fn=<MseLossBackward0>)
tensor(0.0961, grad_fn=<MseLossBackward0>)
tensor(0.0866, grad_fn=<MseLossBackward0>)
tensor(0.0800, grad_fn=<MseLossBackward0>)
tensor(0.0753, grad_fn=<MseLossBackward0>)
tensor(0.0718, grad_fn=<MseLossBackward0>)
tensor(0.0694, grad_fn=<MseLossBackward0>)
tensor(0.0675, grad_fn=<MseLossBackward0>)
tensor(0.0661, grad_fn=<MseLossBackward0>)
tensor(0.0651, grad_fn=<MseLossBackward0>)
tensor(0.0642, grad_fn=<MseLossBackward0>)
tensor(0.0635, grad_fn=<MseLossBackward0>)
tensor(0.0629, grad_fn=<MseLossBackward0>)
tensor(0.0623, grad_fn=<MseLossBackward0>)
tensor(0.0619, grad_fn=<MseLossBackward0>)
tensor(0.0614, grad_fn=<MseLossBackward0>)
tensor(0.0610, grad_fn=<MseLossBackward0>)
tensor(0.0606, grad_fn=<MseLossBackward0>)
tensor(0.0602, grad_fn=<MseLossBackward0>)
tensor(0.0598, grad_fn=<MseLossBackward0>)
tensor(0.0595, grad_fn=<MseLossBackward0>)
tensor(0.0591, grad_fn=<MseLossBackward0>)
tensor(0.0587, grad_fn=<MseLossBackward0>)
tensor(0.0584, grad_fn=<MseLossBackward0>)
tensor(0.0580, grad_fn=<MseLossBackward0>)
tensor(0.0577, grad_fn=<MseLossBackward0>)
tensor(0.0573, grad_fn=<MseLossBackward0>)
tensor(0.0570, grad_fn=<MseLossBackward0>)
tensor(0.0566, grad_fn=<MseLossBackward0>)
tensor(0.0563, grad_fn=<MseLossBackward0>)
tensor(0.0560, grad_fn=<MseLossBackward0>)
tensor(0.0556, grad_fn=<MseLossBackward0>)
tensor(0.0553, grad_fn=<MseLossBackward0>)
tensor(0.0550, grad_fn=<MseLossBackward0>)
tensor(0.0546, grad_fn=<MseLossBackward0>)
tensor(0.0543, grad_fn=<MseLossBackward0>)
tensor(0.0540, grad_fn=<MseLossBackward0>)
tensor(0.0537, grad_fn=<MseLossBackward0>)
tensor(0.0533, grad_fn=<MseLossBackward0>)
tensor(0.0530, grad_fn=<MseLossBackward0>)
tensor(0.0527, grad_fn=<MseLossBackward0>)
tensor(0.0524, grad_fn=<MseLossBackward0>)
tensor(0.0521, grad_fn=<MseLossBackward0>)
tensor(0.0518, grad_fn=<MseLossBackward0>)
tensor(0.0515, grad_fn=<MseLossBackward0>)
tensor(0.0512, grad_fn=<MseLossBackward0>)
tensor(0.0508, grad_fn=<MseLossBackward0>)
tensor(0.0505, grad_fn=<MseLossBackward0>)
tensor(0.0502, grad_fn=<MseLossBackward0>)
tensor(0.0499, grad_fn=<MseLossBackward0>)
tensor(0.0496, grad_fn=<MseLossBackward0>)
tensor(0.0493, grad_fn=<MseLossBackward0>)
tensor(0.0491, grad_fn=<MseLossBackward0>)
tensor(0.0488, grad_fn=<MseLossBackward0>)
tensor(0.0485, grad_fn=<MseLossBackward0>)
tensor(0.0482, grad_fn=<MseLossBackward0>)
tensor(0.0479, grad_fn=<MseLossBackward0>)
tensor(0.0476, grad_fn=<MseLossBackward0>)
tensor(0.0473, grad_fn=<MseLossBackward0>)
tensor(0.0470, grad_fn=<MseLossBackward0>)
tensor(0.0468, grad_fn=<MseLossBackward0>)
tensor(0.0465, grad_fn=<MseLossBackward0>)
tensor(0.0462, grad_fn=<MseLossBackward0>)
tensor(0.0459, grad_fn=<MseLossBackward0>)
tensor(0.0456, grad_fn=<MseLossBackward0>)
tensor(0.0454, grad_fn=<MseLossBackward0>)
tensor(0.0451, grad_fn=<MseLossBackward0>)
tensor(0.0448, grad_fn=<MseLossBackward0>)
tensor(0.0446, grad_fn=<MseLossBackward0>)
tensor(0.0443, grad_fn=<MseLossBackward0>)
tensor(0.0440, grad_fn=<MseLossBackward0>)
tensor(0.0438, grad_fn=<MseLossBackward0>)
tensor(0.0435, grad_fn=<MseLossBackward0>)
tensor(0.0432, grad_fn=<MseLossBackward0>)
tensor(0.0430, grad_fn=<MseLossBackward0>)
tensor(0.0427, grad_fn=<MseLossBackward0>)
tensor(0.0425, grad_fn=<MseLossBackward0>)
tensor(0.0422, grad_fn=<MseLossBackward0>)
tensor(0.0420, grad_fn=<MseLossBackward0>)
tensor(0.0417, grad_fn=<MseLossBackward0>)
tensor(0.0415, grad_fn=<MseLossBackward0>)
tensor(0.0412, grad_fn=<MseLossBackward0>)