pytorch 数据类型
pytorch不是完备的语言库,无法直接处理string
如何处理string 使用onehot编码 embedding:word2vec\glove
对于pytorch来说 数据是同一个数据在cpu 和GPU 数据类型是不一样的,gpu.tensor
GPU tensor torch.cuda.floatTensor
a = torch.randn(2,3)
a.type() =>torch.FloatTensor
isinstance()
标量 torch.tensor(1.)
dimension 0/rank 0 在计算loss中用的比较多
a.shape => torch.Size([])
len(a.shape) => 0
a.size()=》 torch.Size([])
Dim 1 /rank 1 bias 偏度 使用dim 1的数据、linear input
torch.tensor(接收数据内容) FloatTensor(数据维度)
Dim 2 Linear Input Batch
torch.randn(2,3) 随机初始化一个tensor 2维 2行 3列
Dim 3 RNN Input Batch
torch.rand(1,2,3) 第一维1个元素 第二维2个元素,第三维3个元素
Dim 4 图片类型 CNN Input batch
torch.rand(2,3,28,28) (2张照片,3通道,长,宽) (b,c,h,w)
a.numel() 所有元素数量
a.dim() 维度
import from numpy
a = np.array([2,3.3])
torch.from_numpy(a) # 从numpy array 导成tensor类型
#直接用torch.tensor
torch.tensor([2., 3.2]) 小写tensor接收数据
Tensor(维度) # 大写Tensor可接收数据维度
Torch.empty() 不初始化的数据,先初始化tensor再喂给网络
Torch.FloatTensor(d1,d2,d3) Tensor默认是FloatTensor
torch.set_default_tensor_type(torch.DoubleTensor) #转默认成 DoubleTensor
# 随机初始化Tensor
rand/rand_like randint
rand 默认[0,1] 范围内
rand(min,max,shape)
randn 正态分布 默认是服从N(0,1)分布
randn(shape)
torch.full(shape,full的值) # 将tensor全部填充为指定值
arange/range 递增递减
torch.arange(0,10,2) # 建议使用arnage 不用range
linspace/logspace
torch.linspace(0,10, step=4) 0-10切分为4个数
torch.logspace 生成log数
randperm : random.shuffle
index
a.torch.rand(4,3,28,28)
索引 切片和python相同 a[0] 第一个维度索引
a[0,0]
a[:2]
隔行采样 a[:,:,0:28:2,0:28:2].shape => torch.Size([4,3,14,14])
a[....2] 前面几维都默认全选
select by mask
.masked_select()
mask = x.ge(0.5)
得到一个torch.unit8的稀疏矩阵
torch.masked_select(x,mask) 取出x中大于0.5的数据
torch.take()
维度变换
view/reshape 都一样
reshape 和numpy一致
lost dim information
squeeze 挤压 减少维度
unsqueeze 增加维度
a.shape =>torch.Size([4,1,28,28])
a.unsqueeze(0).shape => torch.Size([1,4,1,28,28])
a.unsqueeze(-1).shape => torch.Size([4,1,28,28,1]) # unsqueeze 新插入一个维度,参数为插入位置
a = torch.tensor([1.2,2.3])
a.unsqueeze(-1)=> tensor([1.2000],[2.3000])
a.unsqueeze(0) => tensor([[1.20000,2.3000]])
squeeze 维度删减同样的道理
只能挤压shape 为1 的维度,默认全都把shape1的都挤压掉
expand/repeat
[1,32,1,1] 扩展到 [4,32,14,14]
expand: broadcasting shape为1 的维度可以扩张 参数为扩张后的shape
repeat :memory copied shape为任何数都可以扩张 参数是新的dimension需要拷贝的次数
矩阵转置
.t() 只能适用于dim2的tensor
任意维度使用 transpose() 两两交换 .contiguous() 交换之后把内存顺序变得连续
permute() 参数为原维度,得到结果为参数顺序的维度
Broadcast 自动扩展
tensor做运算 自动插入unsqueeze expand
why broadcasting
1, for actual demanding
2, memory consumption
cat
矩阵相乘 2d tensor torch.mm
torch.matmul @符号 可以做降维
次方 pow()
平方根 sqrt()
torch.exp 自然对数
torch.log() 做log 默认以e为底
.floor() 向下取整 ceil() 向上取整
.clamp() 裁剪 gradient clipping clamp(min,max) 小于min的变为min 大于max变为max
statistics 统计方法
矩阵范数 .norm(范数,dim=指定维度) .norm(1) .norm(2) 1范数 2范数
mean sum min max prod
argmax argmin 最大最小的索引
dim
topk \kthvalue
where 根据条件选择
torch.where(condition,x,y) 选择器 如果满足condition取x得值,否则取y的值
gather
torch.gather(input,dim,index,out=None) 通过索引index 在dim维检索input中的数值