pytorch(3)创建Tensor
一、系列文章目录
(1)梯度下降
(2)手写数字识别引入&Pytorch 数据类型
(3)创建Tensor
(4)Broadcasting
(5)Tensor
(6)Tensor统计
(7)Where和Gather
(8)函数的梯度
(9)loss函数;自动求导
文章目录
- 一、系列文章目录
- 二.创建Tensor
- 1. 从numpy中引入
- 2. 从list中引入
- 3. 未初始化
- 4. 随机初始化
- 5. full
- 6. arange/linspace
- 7. ones/zero/eye
- 8. randperm & 切片&索引
- 9. 改变
- view/reshape 完全一样
- squeeze/unsqueeze压缩和扩张维度
- transpose/t/permute
- expand/repeat
二.创建Tensor
1. 从numpy中引入
import torch
import numpy as np
a = np.array([2,3.3])
torch.from_numpy(a) #不要写成 form
Out[13]: tensor([2.0000, 3.3000], dtype=torch.float64)
a = np.ones([3,3]) #指定形状,用1填充
torch.from_numpy(a)
Out[15]:
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
2. 从list中引入
torch.tensor([2,3.2]) #区分:FloatTensor 指定shape 用小写指定数据
Out[16]: tensor([2.0000, 3.2000])
torch.FloatTensor(2,3)
Out[18]:
tensor([[5.1027e-08, 4.9116e-14, 2.4979e-38],
[2.3518e-38, 1.5046e-36, 1.7636e+25]])#未初始化也有数字哦,所以要注意替换掉这个数字,防止报错
3. 未初始化
同上
4. 随机初始化
rand rand_like randint randn
rand 0-1之间均匀sample 设置shape例如(3,3)
rand_like 对象是一个tensor
randint 三个参数 最小值(包括),最大值(不包括),shape(例如[3,3])
randn 正态分布 设置shape例如(3,3)
5. full
torch.full([2,3],8)
Out[22]:
tensor([[8., 8., 8.],
[8., 8., 8.]])
torch.full([],8) #标量
Out[23]: tensor(8.)
6. arange/linspace
arange
设置范围,生成等差数列,默认公差1
torch.arange(0,10)
Out[24]: tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
第三位参数设置公差
linspace
设置范围和数量,等分切割
torch.linspace(0,10,steps=4) #不是step哦
Out[26]: tensor([ 0.0000, 3.3333, 6.6667, 10.0000])
logspace
生成10的x次方
7. ones/zero/eye
eye 对角是1 只能接受1or2个参数
torch.ones_like(a) a是tensor
8. randperm & 切片&索引
randperm 随即打散 设置number 即有几个数字
a = torch.rand(2,3)
a
Out[5]:
tensor([[0.8746, 0.1088, 0.2276],
[0.0799, 0.4809, 0.4474]])
idex = torch.randperm(2)
idex
Out[7]: tensor([0, 1])
a[idex]
Out[9]:
tensor([[0.8746, 0.1088, 0.2276],
[0.0799, 0.4809, 0.4474]])
a=torch.rand(4,3,28,28) #4张图片,3个通道,28x28
a[0] #第一张图片
a[:2]# 从0开始不包括2,即0,1 只对第一个参数有效
a[:2,1:,-1:,:] #纯:表示全部,
#1: 从1到最后 -1是反向检索, ... -3-2-1
a=torch.rand(4,2)
a
Out[28]:
tensor([[0.0452, 0.3856],
[0.3025, 0.4022],
[0.7373, 0.3566],
[0.0446, 0.7041]])
a[0:4:2]#连在一起没有逗号
Out[29]:
tensor([[0.0452, 0.3856],
[0.7373, 0.3566]])
# 0:28:2 从0到28,不包括28,每隔2个取一次
a[0:4:3]
Out[30]:
tensor([[0.0452, 0.3856],
[0.0446, 0.7041]])
a.index_select(0,torch.tensor([0,2])).shape#list必须转化成tensor
#表示第0个维度,第0个和第2个
Out[14]: torch.Size([2, 3, 2, 2])
a[...].shape#代表除了标明的范围,其余所有都是all
Out[15]: torch.Size([4, 3, 2, 2])
a[0,...].shape #如果用冒号+逗号非常麻烦
Out[16]: torch.Size([3, 2, 2])
a[0,...,::2].shape
Out[18]: torch.Size([3, 2, 1])
9. 改变
view/reshape 完全一样
a.view(_,_) size一样就行
squeeze/unsqueeze压缩和扩张维度
a.unsqueeze( ) dim是数字,范围是[-dim-1,dim+1)
squeeze 只能压缩1
b=torch.rand(32)
f=torch.rand(4,32,14,14)
b=b.unsqueeze(0).unsqueeze(2).unsqueeze(3)
b.shape
Out[28]: torch.Size([1, 32, 1, 1])
transpose/t/permute
.t只适用于矩阵,即2维
transpose只能改一次顺序
permute可以彻底改变顺序
expand/repeat
expand 改变数据理解方式(推荐,速度快节约内存)
repeat 数据增加
expand()参数为扩张结果
条件:dimention一致;只能从1扩张成n,不能扩张234...
repeat()参数为重复的次数
会改变原数据,一般不用
expand_as(A) A为一个tensor
a=torch.rand(4,32,14,14)
b.shape
Out[30]: torch.Size([1, 32, 1, 1])
b.expand(4,32,-1,14).shape #-1表示不变
Out[33]: torch.Size([4, 32, 1, 14])
b.expand(4,32,-1,14).shape
Out[33]: torch.Size([4, 32, 1, 14])
b.expand(-1,32,-1,-4).shape # -4这是个bug