从 X 入门Pytorch——环境安装建议,Tensor多种构造方式,Tensor的基本操作

本文参加新星计划人工智能(Pytorch)赛道: https://bbs.csdn.net/topics/613989052

满打满算,入门CV的坑已经快一年了,现在忙着换模型,加模块,看效果。
但是最近看了一篇UNet++模型提出者对UNet的剖析和探讨(链接奉上研习U-Net),大受震撼,同时结合自己之前在模型创新中吃过的亏,感觉基础不牢,地动山摇,于是开了这篇博文。

1 环境安装

1.1 自己搭建环境

我使用的基本配置:Python3.7+Torch1.12+VsCode+Nvidia 4090
具体的安装,以及出现的问题由于每个人的电脑环境和服务器配置不同,可能出现的问题不同,这里给大家汇总几个不错的安装教程:

  1. Pytorch安装
  2. Pytorch安装一步到位
  3. Pytorch安装 GPU or CPU

1.2 使用免费环境

推荐平台:https://www.kaggle.com/,点进去,点击 +号 -> New NoteBook,达到以下内容:
平台详情页:
在这里插入图片描述

去年5月份刚入门的时候,没有显卡,啥也没有,刚开始用一个2018年入手的4000块的笔记本跑的基础知识点,后来用的Kaggle平台,当时跑出的第一个Epoch时,别提多兴奋,希望大家也可以有收获知识的喜悦。

2 Tensors(张量)

Tensors类似于NumPy的ndarrays,同时Tensors可以使用GPU进行加速计算。

2.1 构造一个Tensor

汇总:

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]])

2.2 Tensor张量操作

汇总:

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

文章已更新:Tensor的索引,切片,拼接,拆分,Reduction操作

猜你喜欢

转载自blog.csdn.net/qq_44864833/article/details/129581337