文章目录
- 1 pytorch的安装
- 2 PyTorch基础知识
-
- 2.1 张量简介
- 2.2 初始化
- 2.3 张量的属性
- 2.4 ndarray与tensor互转
- 2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置
- 3 pytorch自动微分
- 4 线性回归
- 5 分类
-
1 pytorch的安装
- pytorch官网
https://pytorch.org/get-started/locally/
- 个人学习因此,选择CPU安装。
- 使用国内阿里云镜像安装
库名 |
作用 |
torchvision |
图像视频处理 |
torchaudio |
音频处理 |
torchtext |
自然语言处理 |
pip install -i https://mirrors.aliyun.com/pypi/simple/ torch torchvision torchaudio torchtext
- 出现以下界面说明安装成功
- 验证是否安装成功
2 PyTorch基础知识
2.1 张量简介
- 分类:0维张量(标量)、1维张量(向量)、2维张量(矩阵)、3维张量(时间序列)、4维张量(图像)、5维张量(视频)
- 概念:一个数据容器,可以包含数据、字符串等
- 常见的构造Tensor的函数
函数 |
功能 |
Tensor(*sizes) |
基础构造函数 |
tensor(data) |
类似于np.array |
ones(*sizes) |
全1 |
zeros(*sizes) |
全0 |
eye(*sizes) |
对角为1,其余为0 |
arange(s,e,step) |
从s到e,步长为step |
linspace(s,e,steps) |
从s到e,均匀分成step份 |
rand/randn(*sizes) |
rand是[0,1)均匀分布;randn是服从N(0,1)的正态分布 |
normal(mean,std) |
正态分布(均值为mean,标准差是std) |
randperm(m) |
随机排列 |
函数 |
作用 |
torch.abs(A) |
绝对值 |
torch.add(A,B) |
相加,A和B既可以是Tensor也可以是标量 |
torch.clamp(A,max,min) |
裁剪,A中的数据若小于min或大于max,则变成min或max,即保证范围在[min,max] |
torch.div(A,B) |
相除,A%B,A和B既可以是Tensor也可以是标量 |
torch.mul(A,B) |
点乘,A*B,A和B既可以是Tensor也可以是标量 |
torch.pow(A,n) |
求幂,A的n次方 |
torch.mm(A,B.T) |
矩阵叉乘,注意与torch.mul之间的区别 |
torch.mv(A,B) |
矩阵与向量相乘,A是矩阵,B是向量,这里的B需不需要转置都是可以的 |
A.item() |
将Tensor转化为基本数据类型,注意Tensor中只有一个元素的时候才可以使用,一般用于在Tensor中取出数值 |
A.numpy() |
将Tensor转化为Numpy类型 |
A.size() |
查看尺寸 |
A.shape |
查看尺寸 |
A.dtype |
查看数据类型 |
A.view() |
重构张量尺寸,类似于Numpy中的reshape |
A.transpose(0,1) |
行列交换 |
A[1:]A[-1,-1]=100 |
切面,类似Numpy中的切面 |
A.zero_() |
归零化 |
torch.stack((A,B),sim=-1) |
拼接,升维 |
torch.diag(A) |
取A对角线元素形成一个一维向量 |
torch.diag_embed(A) |
将一维向量放到对角线中,其余数值为0的Tensor |
2.2 初始化
import torch
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
print(f"Tensor from Data:\n {x_data} \n")
import numpy as np
data = [[1, 2], [3, 4]]
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
print(f"Tensor from Numpy:\n {x_np} \n")
import torch
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
x_ones = torch.ones_like(x_data)
print(f"Ones Tensor: \n {x_ones} \n")
x_rand = torch.rand_like(x_data, dtype=torch.float)
import torch
shape = (2, 3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
2.3 张量的属性
import torch
tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
2.4 ndarray与tensor互转
import numpy as np
import torch
print(np.__version__)
print(torch.__version__)
print("tensor转ndarray")
a = torch.ones(5)
print(type(a))
b = a.numpy()
print(type(b))
print("ndarray转tensor")
a1 = np.ones(5)
print(type(a1))
b2 = torch.from_numpy(a1)
print(type(b2))
2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置
import torch
import numpy as np
t = torch.randint(0, 10, (4, 5))
print(t)
print(t.shape)
print(t[0, 0])
print(t[0])
print(t[1:3])
print(t[:, 1:3])
print(t[1:3, 1:3])
print(t.reshape(4, 5, 1))
print(t[:, :, None])
print(t[..., None])
print(t[:, None, :])
print(t.reshape(4, 5, 1).squeeze())
print(t[:, None, :].squeeze())
print(t.unsqueeze(dim=0).shape)
tensor = torch.tensor([[1], [2], [3]])
print(tensor.expand(3, 4))
n = np.random.random((32, 224, 224, 3))
print(n[0, :, :, 0].shape)
t = torch.tensor(n)
print(t.shape)
print(t[0, :, :, 0].shape)
t = torch.randint(0, 10, (4, 5))
print(t)
print(t.sum())
print(t.sum(dim=0))
print(t.sum(dim=0,keepdim=True))
print(t.sum(dim=1))
print(t.sum(dim=1,keepdim=True))
print(t.argmax(dim=0))
print(t.argmax(dim=1))
t1 = torch.randint(0,10,size=(4,5))
t2 = torch.randint(0,10,size=(4,5))
print(t1)
print(t2)
print(t1[0].dot(t2[0]))
print(torch.concat((t1,t2)))
print(torch.vstack((t1,t2)))
print(torch.concat((t1,t2),dim=1))
print(torch.hstack((t1,t2)))
print("--------------切割----------------")
t = torch.randint(0,10,size=(4,5))
print(t)
print(t.split([1,2,1]))
print(torch.permute(t,[1,0]).shape)
print(t.transpose(1,0).shape)
3 pytorch自动微分
import torch
x = torch.ones(1, 1, requires_grad=True)
y = 2 * x + 2
y.backward()
print(x.grad)
4 线性回归
from torch import nn, optim, tensor
X = tensor([[1.0], [2.0], [3.0], [4.0]])
Y = tensor([[3.0], [5.0], [7.0], [9.0]])
model = nn.Linear(1, 1)
loss_fn = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), 0.001)
for epoch in range(1000):
for x, y in zip(X, Y):
y_pred = model(x)
loss = loss_fn(y, y_pred)
optimizer.zero_grad()
loss.backward()
optimizer.step()
weight = model.weight
print(weight)
bias = model.bias
print(bias)
5 分类
5.1 写法一
import torch
from torch import nn,float
data = [[1, 3, 5, 7, 9, 1],
[2, 4, 6, 8, 10, 0],
[11, 13, 15, 17, 19, 1],
[12, 14, 16, 18, 20, 0],
[21, 23, 25, 27, 29, 1],
[22, 24, 26, 28, 30, 0],
[31, 33, 35, 37, 39, 1],
[32, 34, 36, 38, 40, 0],
[41, 43, 45, 47, 49, 1],
[42, 44, 46, 48, 50, 0], ]
t_data = torch.tensor(data,dtype=float)
X = t_data[:, :-1]
print(type(X))
print(X)
Y = t_data[:, -1]
Y = Y.reshape(-1, 1)
print(type(X))
print(Y)
print(X.shape)
model = nn.Sequential(
nn.Linear(5, 50),
nn.Linear(50, 1),
nn.Sigmoid()
)
state_dict = model.state_dict()
print(state_dict)
loss_fn = nn.BCELoss()
optim_sgd = torch.optim.SGD(model.parameters(), 0.001)
batch_size = 2
steps = 10 // 2
for epoch in range(100):
for batch in range(steps):
start = batch * batch_size
end = start + batch_size
x = X[start:end]
y = Y[start:end]
y_pred = model(x)
loss = loss_fn(y_pred, y)
optim_sgd.zero_grad()
loss.backward()
optim_sgd.step()
print(model.state_dict())
acc_rate = ((model(X).data.numpy() >= 0.5) == Y.numpy()).mean()
5.2 写法二
import torch
from torch import nn, float
import numpy as np
data = [[1, 1],
[2, 0],
[11, 1],
[12, 0],
[21, 1],
[22, 0],
[31, 1],
[32, 0],
[41, 1],
[42, 0], ]
t_data = torch.tensor(data, dtype=float)
X = t_data[:, :-1]
Y = t_data[:, -1]
Y = Y.reshape(-1, 1)
print(X.shape)
class DemoModl(nn.Module):
def __init__(self):
super().__init__()
self.lin_1 = nn.Linear(1, 50)
self.lin_2 = nn.Linear(50, 1)
self.sigmod = nn.Sigmoid()
self.activate = nn.ReLU()
def forward(self, input):
x = self.lin_1(input)
x = self.activate(x)
x = self.lin_2(x)
x = self.sigmod(x)
return x
lr = 0.001
def get_model():
model = DemoModl()
return model, torch.optim.Adam(model.parameters(),lr=lr)
loss_fn = nn.BCELoss()
model,opt = get_model()
batch_size = 2
steps = 10 // 2
for epoch in range(1000):
for batch in range(steps):
start = batch * batch_size
end = start + batch_size
x = X[start:end]
y = Y[start:end]
y_pred = model(x)
loss = loss_fn(y_pred, y)
opt.zero_grad()
loss.backward()
opt.step()
print('loss=========',loss_fn(model(X),Y))
acc_rate = ((model(X).data.numpy() >= 0.5) == Y.numpy()).mean()
print(acc_rate)
print(np.unique(model(X).data.numpy()))
- 参考
https://www.bilibili.com/video/BV1hs4y1B7vb/?p=43&spm_id_from=333.880.my_history.page.click&vd_source=c15794e732e28886fefab201ec9c6253