本文参加新星计划人工智能(Pytorch)赛道: https://bbs.csdn.net/topics/613989052
满打满算,入门CV的坑已经快一年了,现在忙着换模型,加模块,看效果。
但是最近看了一篇UNet++模型提出者对UNet的剖析和探讨(链接奉上:研习U-Net),大受震撼,同时结合自己之前在模型创新中吃过的亏,感觉基础不牢,地动山摇,于是开了这篇博文。
我使用的基本配置:Python3.7+Torch1.12+VsCode+Nvidia 4090
具体的安装,以及出现的问题由于每个人的电脑环境和服务器配置不同,可能出现的问题不同,这里给大家汇总几个不错的安装教程:
推荐平台:https://www.kaggle.com/,点进去,点击 +号 -> New NoteBook,达到以下内容:
平台详情页:
去年5月份刚入门的时候,没有显卡,啥也没有,刚开始用一个2018年入手的4000块的笔记本跑的基础知识点,后来用的Kaggle平台,当时跑出的第一个Epoch时,别提多兴奋,希望大家也可以有收获知识的喜悦。
Tensors类似于NumPy的ndarrays,同时Tensors可以使用GPU进行加速计算。
汇总:
Name | Out |
---|---|
torch.empty(a, b, c, …) | 得到一个a×b×c×…维度的未初始化的张量 |
torch.randn(a, b, c, …) | 得到一个a×b×c×…维度的张量, 数据是从正态分布采样的元素 |
torch.rand(a, b, c, …) | 得到一个a×b×c×…维度的张量,数据从[0, 1]均匀分布采样的元素 |
torch.randint(start, end, (a,b,…)) | 得到一个a×b×…维度的张量,数据从[start, end]均匀分布采样的元素 |
torch.zeros(a, b, c, …) | 得到一个a×b×c×…维度的全0的张量 |
torch.tensor([列表数据]) | 将列表转化为张量 |
torch.ones(a, b, c, …) | 得到一个a×b×c×…维度的全1的张量 |
torch.arange(start, end, step=1).view(a, b, c, …) | 得到一个a×b×c×…维度的数值从start到end的张量,step为步长默认为1 |
.reshape(a, b, c) | 和view相同的作用 |
torch.randn_like(Ten_b) | 得到一个维度和Ten_b一样的张量 |
提醒:在以上构建Tensor中,也可以指定数据的类型和设备,如torch.rand(3, 4, dtype=torch.float, device=torch.device('cuda:0')) 生成一个在GPU上的3×4维的正浮点数张量, 用的不多,权当了解。
示例:
构造一个5×3的张量,不进行初始化:
import torch
x = torch.empty(5, 3)
print(x)
out:
tensor([[-3.7930e+34, 9.2065e-43, -3.7930e+34],
[ 9.2065e-43, -3.7930e+34, 9.2065e-43],
[-3.7930e+34, 9.2065e-43, -3.7930e+34],
[ 9.2065e-43, -3.7930e+34, 9.2065e-43],
[-3.7930e+34, 9.2065e-43, -3.7930e+34]])
构造一个随机初始化的张量
x = torch.randn(5, 3)
print(x)
out:
tensor([[ 1.3456, -2.0320, 1.9946],
[-1.2530, 1.5225, 1.2868],
[-1.4888, -0.1697, 0.0157],
[-0.4710, -0.4584, -0.7818],
[ 0.5683, 0.5734, -1.5261]])
构造一个全为0的张量,并且设置数据类型为long
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
out:
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
构造一个张量,直接使用数据:
x = torch.tensor([5.55, 3.33])
print(x)
out:
tensor([5.5500, 3.3300])
构造一个全为1的张量,并构造一个和其维度信息相同的随机张量
x = torch.ones(5, 3)
print(x)
y = torch.randn_like(x)
print(y)
out:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
tensor([[-0.5396, -0.0499, 0.8502],
[-1.6198, -0.4737, 1.3893],
[-0.4530, 1.4044, 1.1528],
[ 1.6513, -0.2941, 0.6844],
[ 0.6168, -0.5842, 0.9888]])
构造一个有顺序数字组成的张量:
x = torch.arange(1,16).view(5,3) # 前闭后开 .view() 用来改变维度 .reshape() 也是一样可以用来改变维度
print(x)
out:
tensor([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15]])
获得张量中的某一个值:
x = torch.arange(1,16).reshape(3,5)
print(x)
x[2][3] = 111
print(x)
print(x[2][3], x[2][3].item()) # .item()用来获取数值,且只能针对1×1的张量
out:
tensor([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]])
tensor([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[ 11, 12, 13, 111, 15]])
tensor(111) 111
获得从连续数值中采样的张量:
x = torch.randint(1, 16,(5, 3))
print(x)
out:
tensor([[ 6, 7, 9],
[ 5, 12, 10],
[15, 10, 10],
[ 5, 11, 13],
[ 2, 13, 8]])
汇总:
Name | Out |
---|---|
a+b | 对应元素相加 |
a-b | 对应元素相减 |
a*b | 对应元素相乘 |
torch.mm(a, b) | 矩阵相乘 |
torch.clamp(a, min=x, max=y) | 张量a中小于x的用x代替,大于y的用y代替 |
torch.round(a) | 小数化整,遵循四舍五入原则 |
a和b都是相同维度的张量
演示:
加法和减法都是对应元素操作,这里不做演示!
点乘和矩阵乘法的不同:
import torch
a = torch.ones(3, 3)
b = torch.arange(1, 10, dtype=torch.float).view(3, 3) # 这里需要给数据规定类型,因为只有float类型可以做矩阵乘法
print(a*b)
print(torch.mm(a, b))
out:
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
tensor([[12., 15., 18.],
[12., 15., 18.],
[12., 15., 18.]])
简单的分段函数作用:
import torch
b = torch.arange(1, 10, dtype=torch.float).view(3, 3)
x = torch.clamp(b, min=3, max=8)
print("b的值:", b)
print("x的值:", x)
out:
b的值: tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
x的值: tensor([[3., 3., 3.],
[4., 5., 6.],
[7., 8., 8.]])
小数化整的简单使用:
a = torch.Tensor([-1.1, 0.5, 0.501, -1.8])
print(torch.round(a))
out:
tensor([-1., 0., 1., -2.])
文章已更新:Tensor的索引,切片,拼接,拆分,Reduction操作