python | pytorch |
---|---|
int | IntTensor |
float | FloatTensor |
Int array | IntTensor … |
String | – |
isinstance(a,torch.FloatTensor) —— 判断a的数据类型是不是torch.FloatTensor
type(a) —— 查看a的数据类型
data = data.cuda() —— 将变量放在cuda上,在查看数据类型会发生变化
a = torch.tensor(1.) —— 维度为0的标量
a.shape —— 输出: torch.Size([])
len(a.shape) —— 输出0
a.size() —— 成员函数
b = torch.tensor([1.1,2.2])
b = torch.FloatTensor(1) —— 长度为1
b = torch.FloatTensor(2) —— 长度为2
b = torch.from_numpy(data) —— data为numpy
注意1: dim指的是行和列;size/shape指的是b的形状;tensor指的是b
b.shape —— 返回形状; b.numel() —— 返回所有维度相乘的值; b.dim() —— 返回维度
a = torch.tensor([2.,3.2])
a = torch.Tensor(此处输入的是shape),a = torch.Tensor(2,3)
a = torch.FloatTensor(此处输入的也是shape)
pytorch 默认是torch.FloatTensor
torch.set_default_tensor_type(torch.DoubleTensor) —— 把默认类型变成torch.DoubleTensor
随机初始化:torch.rand(3,3) —— 随机生成3行3列【0,1】之间的数字
torch.rand_like(a) —— 输入一个tensor,随机生成和a的size相似的tensor
torch.randint(1,10,[3,3]) —— 1是最小值,10是最大值,[3,3]是输入的size
torch.randn(3,3) —— 生成N(0,1)的正态分布
torch.normal(mean = torch.full([10],0), std=torch.arrage(1,0,-0.1)) —— 生成维度为1,长度为10
torch.full([2,3],7) —— 生成全部为7的2行3列
torch.full([],7) —— 生成维度为0的标量,tensor(7.)
torch.full([1],7) —— 生成维度为1的tensor,tensor([7.])
torch.full([2],7) —— [7.,7.]
torch.arrange(0,10] —— tensor([0,1,2,3,4,5,6,7,8,9])
torch.arrage(0,10,2) —— tensor([0,2,4,6,8]),2表示的是阶梯值
torch.linspace(0,10,steps=4) —— tensor([0.0000,3.3333,6.6667,10.0000])
torch.linspace(0,10,steps=10) —— tensor([0.0000,1.1111,2.2222,3.3333,4.4444,5.5556,6.6667,7.7778,8.8889,10.0000])
torch.ones(3,3) —— 给的是shape
torch.zeros(3,3) —— 给的是shape,输出的是矩阵
torch.eye(3,4) —— 生成对角元素是1.,其它元素为0.的对角矩阵
torch.eye(3) —— 表示生成3*3的对角矩阵
idx = torch.randperm(2)
idx —— 打散一次
a[idx] —— 将打散后的坐标赋给a这个tensor
a[:,:,:]与python一样的规则
a[ 0: 28:2] 每隔2个进行采样
a.index_select(1,[0,2]) —— 第一个参数表示在第几个维度上,第二个参数表示取几个数
这两个函数在目前的版本完全通用
a = torch.rand(4,1,28,28)
a.view(4,28*28)
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])
a.unsqueeze(4).shape —— torch.Size([4,1,28,28,1])
b.shape —— torch.Size([1,32,1,1])
不给参数的话,会把维度为1的全挤压掉
b.squeeze().shape —— torch.Size([32])
b.squeeze(0).shape —— torch.Size([32,1,1])
要求原来的维度和要扩展维度的维度是一样的
a = torch.rand(4,32,14,14)
b.shape —— torch.Size([1,32,1,1] )
b.expand(4,32,14,14).shape —— torch.Size([4,32,14,14])
b.expand(4,33,14,14) —— 会报错
b.shape —— torch.Size([1,32,1,1])
b.repeat(4,32,1,1).shape —— torch.Size([4,1024,1,1]) ,repeat输入的数字表示要拷贝的次数
a = torch.randn(3,4)
a.t() —— torch.Size(4,3) 只能用于2D操作
a.shape —— [4,3,32,32]
a.transpose(1,3).shape —— torch.Size([4,28,28,3])
b = torch.rand(4,3,28,32)
b.transpose(1,3).shape —— torch.Size([4,32,28,3])
b.permute(0,2,3,1).shape —— torch.Size([4,28,32,3])
broadcast
a = torch.rand(4, 32, 8)
b = torch.rand(5, 32, 8)
torch.cat([a,b], dim = 0).shape —— torch.Size([9,32,8]) ,dim=0表示在第0个维度进行拼接,dim=1表示在第一个维度进行拼接
a1=torch.rand(4,3,16,32)
a2=torch.rand(4,3,16,32)
torch.cat([a1,a2], dim=2).shape —— torch.Size([4,3,32,32])
如果是用stack如下:
torch.stack([a1,a2], dim=2).shape —— torch.Size([4,3,2,16,32])
按长度拆分,长度一样给固定值,长度不一样给一个list
c:[3,32,8]
a,b = c.split([2,1],dim=0)
a:[2,32,8] b:[1,32,8]
按数量拆分
c:[2,32,8]
a,b = c.chunk(2,dim=0)—— a:[1,32,8] b:[1,32,8]
torch.add(a,b)
torch.sub(a,b)
torch.matmul(a,b) —— 表示a,b按矩阵的方式相乘
a*b —— 表示a和b相对应的元素相乘
多维使用matmul,仅对最后两维进行操作
pow(a,3) 表示a的三次方
aa.sqrt() 表示aa开平方
aa2 表示aa的平方
aa0.5 表示aa的开根号
a = torch.tensor(3.14)
a.round() 表示四舍五入
裁剪
grad.clamp(10) —— 把10裁掉
grad.clamp(0,10) ——保留0到10之间的值
a.norm(1)
a.norm(2)
如果想要在指定维度得到最大最小值,需要给定维度
argmin,argmax 返回的是最大值最小值的索引
a.argmax(dim=1) 表示在第一个维度返回最大值的索引号
a.topk(2,dim=1,largest = True) 得到概率最大的前2个数,largest = False表示得到最小值,不设置表示得到最大值
a.kthvalue(8,dim=1) 表示得到第8个小的值,注意只能设置为最小值
net.load_state_dict(torch.load(‘ckpt.mdl’))
torch.save(net.state_dict(),‘ckpt.mdl’)
为什么要定义Flatten类?
因为F.relu()是函数,不能放在nn.Sequential()里,nn.Sequential()只能放类,所以自己封装一个Flatten类,同理Reshape也需要自己封装
class Flatten(nn.Module):
def __init__(self):
super(Flatten,self).__init__()
def forward(self,input):
return input.view(input.size(0),-1)
这样的话当调用nn.parameter()就可以得到所有的参数
就可以自动的被SGD优化
class MyLinear(nn.Module):
def __init__(self, inp,outp):
super(MyLinear,self).__init__()
# requires_grad = True,默认就会设置为true
self.w = nn.Parameter(torch.randn(outp,inp))
self.b = nn.Parameter(torch.randn(outp))
def forward(self,x):
x = x @ self.w.t() + self.b
return x