pytorch学习笔记(1)

首先安装好后pytorch

使用import pytorch如果程序不报错,那么就是安装好了。

一、torch数据结构——tensor(张量)

  • torch.float()
  • torch.int()
  • torch.bool()

torch创建tensor时要用dtype指定类型

torch也可以使用指定类型函数快速创建 

d = torch.FloatTensor(2,3)
e = torch.IntTensor(2)
f = torch.IntTensor([1,2,3,4])
print(d, e, f)

out:

tensor([[ 7.2398e-07,  4.5710e-41, -2.0912e+23],
        [ 3.0812e-41,  6.7262e-43,  0.0000e+00]]) 

tensor([64,  0], dtype=torch.int32) 

tensor([1, 2, 3, 4], dtype=torch.int32)

其他torch函数

torch.rand(2, 3)  # 两行三列的随机数 

torch.ones(2, 3)  # 两行三列的全1,默认dtype=float32,也可指定dtype改变

torch.zeros(2, 3)  # 两行三列的全0,dtype=float32

torch.arange(0, 10, 2)  # 0到10,间隔为2, --> tensor([0, 2, 4, 6, 8])

二、torch和numpy互换

numpy的array和torch的tensor可以相互转换

# 定义numpy数组

# array --> tensor
arr1 = np.array([[1,2,3],[4,5,6]])
ten1 = torch.tensor(arr1)       # method 1

# tensor --> array 
ten2 = torch.from_numpy(arr1)   # method 2
arr2 = ten.numpy()

out:
ten1:     tensor([[1, 2, 3],
                  [4, 5, 6]])

tens:     tensor([[1, 2, 3],
                  [4, 5, 6]])
arr2:     [[1 2 3]
          [4 5 6]]

三、tensro的属性

a = torch.tensor([1,2,3])

a.shape  # -->torch.Size([3])   和调用a.size()   得到的结果相同

a.dtype   # -->cpu

a.device  # -->torch.int64

四、torch的运算

基础:  + - * /

############哈达玛积(element wise,对应元素相乘)
a*b     +-*/
torch.mul(a,b)   # add sub div
a.mul(b)
a.mul_(b)   # -->  加下划线之后,乘完之后改变a的值

#######矩阵运算

###低维情况
a = torch.tensor([[1,2],[3,4]])
b = torch.tensor([[1,0],[1,0]])
print(a, "\n",b)

print(torch.mm(a,b))     # 矩阵乘积形式1
print(torch.matmul(a,b)) # 矩阵乘积形式2
print(a @ b)             # 矩阵乘积形式3
print(a.matmul(b))       # 矩阵乘积形式4
print(a.mm(b))           # 矩阵乘积形式5

###高维情况
# 前两个必须相同,后面两位相乘

a = torch.ones(1,2,3,4)
b = torch.ones(1,2,4,3)
# 3*4 @ 4*3 = 3*3
print(a.matmul(b))
print(torch.matmul(a, b))

 幂指对运算 pow、 exp、 log

###########幂运算

##### a^2
torch.pow(a,2) 
a.pow(2)
a**2
a.pow_(2)

##### e^x
torch.exp(a))
b = a.exp_()

##### 根号
a.sqrt()
a.sqrt_()

###########对数运算
torch.log2(a)  # 每个数都分别取对数
torch.log10(a)
torch.log(a)   #  底数为e

相同返回True

################### tensor 比较运算

torch.eq(input,other,out=None)# 对每个元素进行等式操作,返回boolean tensor,全部相同返回True
torch.equal(tensor1,tensor2)# 如果tensor1,tensor2 有相同的size和elements,则为一个True或False
torch.ge(input,other,out=None)  # input >=other
torch.gt(input,other,out=None)  # input >other
torch.le(input,other,out=None)  # input <=other
torch.lt(input,other,out=None)  # input <other
torch.ne(input,other,out=None)  # input !=other


################### 取前k大、前k小、第k小的数值及其索引

torch.sort(input,dim=None,descending=False,out=None)  # 对目标input进行排序
torch.topk(input,k,dim=None,largest=True,sorted=True,out=None)  
# 沿着指定维度返回最大K个数值及其索引值
torch.kthvalue(input, k, dim=None, out=None)  # 沿着指定维度返回第k个最小值及其索引值

################### tensor判断是否是finite/ inf/ nan 

torch.isfinite(tensor) / torch.isinf(tensor) / torch.isnan(tensor)
返回一个标记元素为finite/ inf/ nan 的mask张量

torch其他函数

################### torch统计学函数

torch.mean()      #返回均值 
torch.sum()       #返回总和 
torch.prod()      #返回 所哟普元素的积
torch.max()       #返回最大值 
torch.min()       #返回最小值
torch.argmax()    #返回最大值排序的索引值
torch.argmin()    #返回最小值排序的索引值
torch.std()       #返回标准差 
torch.var()       #返回方差
torch.median()    #返回中间值 
torch.mode()      #返回众数值
torch.histc()     #返回input的直方图
torch.bincount()  #返回每个值的频数,只支持一维的tensor

################### tensor函数

torch.abs()  # L1_loss   
torch.sigmoid()  # 激活函数
torch.sign()  # 符号函数  -1,x<0   0,x=0     1,x>0
torch.cumprod()
torch.cumsum()

五、torch操作

if tensor.cuda.is_available():

        tensor = tensor.to("cuda")

索引切片

a[ : ,  1 ]  -->第一列

a[ 0 ,  : ]  -->第一行

改变形状

改变tensor形状view()    类似于numpy的reshae

a.view(3,2)

a.view(-1,3)  # -1是由自动推导

合并tensor

t1 = torch.cat([tensor1, tensor2, tensor3], dim=1)

a=torch.rand(4,32,8)  # 4层32行8列
b=torch.rand(5,32,8)  # 5层32行8列
torch.cat([a,b], dim=0).shape
 #  --> torch.Size([9, 32, 8])  如果使用dim=1报错,因为4和5不相同

a=torch.rand(4,32,8)
b=torch.rand(4,32,8)
torch.cat([a,b], dim=1).shape  # 
torch.Size([4, 64, 8]) 因为4,,8相同

t2 = torch.stack([tensor1, tensor2],dim=1)

a=torch.rand(4,32,8)
b=torch.rand(4,32,8)torch.stack([a,b], dim=1).shape  # 
torch.Size([4, 2, 32, 8]) 因为4,,8相同

torch.Size([4, 2, 32, 8])

六、自动求导

x1 = torch.tensor(1, requires_grad = True)  # requires_grad表示这个变量可求导

x2 = torch.tensor(2, requires_grad = True) 

y = x1 + x2 * 2

使用x1.requires_grad   会返回True 或者 False,表示是否可以求导

out:        y = tensor(5.0, grad_fn=<AddBackward0>

此时如果输入:

x1.grad.data    程序报错,因为此时只进行了前向传播,未进行反向传播

所以,用反向传播

y = x1 + x2 * 2

y.backward()

print(x1.grad.data)  -->  tensor(1.)

print(x2.grad.data)  -->  tensor(2.)

注意:

# 1、 导数是会累计的,重复运行相同命令,grad会增加
# 2、 所以每次计算前都要清除当前导数值避免累计,这一功能可以通过pytorch的optimizer实现

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值