pytorch基本语法学习(一)

Pytorch基础语法学习(一)

因为之前的研究主要是机器学习,所以很少用到tensor张量,最近的一些研究课题都是基于深度学习为基础的,不得不逼自己学习一下深度学习的框架。最早接触深度学习时使用的框架是tensorflow,通过交流学习发现很多的课题组已经转向pytorch的框架,想了想自己的基础,本身tensorflow框架也一样不熟悉,那就直接入手pytorch吧。tensorflow的框架不完美但最流行,社区强大,适合生产环境。而pytorch具有简洁、速度、易用、活跃的社区。接下来我就写一下自己学习的基础语法,也是为自己做个记录,方便后期写代码时忘记的语法有一个比较好的查阅资料。

1. 创建tensor

之前使用的数据结构类型比较多的是list,array,因此,如果我们获取到list,array类型的数据如何转换成tensor呢?这就是我们首先需要解决的问题:
array转tensor:核心在于torch.from_numpy

import torch
import numpy as np

a = np.array([2, 3, 4])
print('a = ', a)  # a =  [2 3 4]
print(type(a))  # <class 'numpy.ndarray'>

a1 = torch.from_numpy(a)
print('a1 = ', a1)  # a1 =  tensor([2, 3, 4])
print(type(a1))  # <class 'torch.Tensor'>

b = np.ones([2, 3]) # 生成2行3列的数组且元素均为1
print('b = ', b)  # b =  [[1. 1. 1.]
                       # [1. 1. 1.]]
print(type(b))  # <class 'numpy.ndarray'>
b1 = torch.from_numpy(b)
print('b1 = ', b1)  # b1 =  tensor([[1., 1., 1.],
                                # [1., 1., 1.]], dtype=torch.float64)
print(type(b1))  # <class 'torch.Tensor'>

list转tensor:一般情况下建议使用torch.FloatTensor

a = [1,2,3]
print('a = ', a)  # a =  [1, 2, 3]
print(type(a))  # <class 'list'>
a1 = torch.tensor(a)
print('a1 = ', a1)  # a1 =  tensor([1, 2, 3])
print(type(a1))  #  <class 'torch.Tensor'>
a2 = torch.FloatTensor(a)
print('a2 = ', a2)  # a2 =  tensor([1., 2., 3.])
print(type(a2))  #  <class 'torch.Tensor'>

初始化一个tensor:一般情况下建议使用torch.FloatTensor

a = torch.FloatTensor(3,2)
print('a = ', a) # a =  tensor([[ 0.0000e+00,  0.0000e+00],
                             #[ 0.0000e+00,  0.0000e+00],
                             #[-3.9671e+06,  3.0702e-41]])
print(a.shape)  # torch.Size([3, 2])

tensor随机选取

a = torch.FloatTensor(2,3,4)
b = torch.randperm(1)  # 随机输出,相当于random.shuffle
c = a[b]
print('a = ', a)  # a =  tensor([[[ 2.0465e-27,  4.5850e-41,  0.0000e+00,  0.0000e+00],
                               #[ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                               #[ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00]],

                               # [[-7.8764e+26,  3.0810e-41,  0.0000e+00,  0.0000e+00],
                               # [ 1.4013e-45,  0.0000e+00,  1.5414e-44,  0.0000e+00],
                               # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00]]])
print('b = ', b)  # tensor([0])
print('c = ', c)  # c =  tensor([[[ 2.0465e-27,  4.5850e-41,  0.0000e+00,  0.0000e+00],
                               # [ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                               # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00]]])

tensor其他常用操作

a = torch.arange(0,10)
print('a = ', a)  # a =  tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

b = torch.arange(0,10,2)
print('b = ', b)  # b =  tensor([0, 2, 4, 6, 8])

a = torch.linspace(0,10,steps=4) #在0到10直接等距离取4个数
print('a = ', a)  # a =  tensor([ 0.0000,  3.3333,  6.6667, 10.0000])

a1 = torch.linspace(0,10,steps=10)
print('a1 = ', a1) # a1 =  tensor([ 0.0000,  1.1111,  2.2222,  3.3333,  4.4444,  5.5556,  6.6667,  7.7778, 8.8889, 10.0000])

a2 = torch.linspace(0,10,steps=11)
print('a2 = ', a2) # a2 =  tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

2. tensor的索引与切片

tensor索引

a = torch.FloatTensor(2,3,4)
print('a = ', a)  #a =  tensor([[[ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [-1.2391e-11,  3.0756e-41,  0.0000e+00,  0.0000e+00]],

                            # [[ 1.4013e-45,  0.0000e+00,  1.6816e-44,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00]]])
print(a.shape)  # torch.Size([2, 3, 4])
print(a[0].shape)  # torch.Size([3, 4])
print(a[0,0].shape)  # torch.Size([4])
print(a[0,0,0])  # tensor(1.4013e-45)

tensor切片1

a = torch.FloatTensor(2,3,4)
print('a = ', a)  #a =  tensor([[[ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [-1.2391e-11,  3.0756e-41,  0.0000e+00,  0.0000e+00]],

                            # [[ 1.4013e-45,  0.0000e+00,  1.6816e-44,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00]]])
print(a.shape)  # torch.Size([2, 3, 4])
print(a[:1])   # tensor([[[ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                        # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                        # [-1.2391e-11,  3.0756e-41,  0.0000e+00,  0.0000e+00]]])
print(a[:1].shape)  # torch.Size([1, 3, 4])
print(a[:1,:1,:])  # tensor([[[1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a[:1,:1,:].shape)  #torch.Size([1, 1, 4])
print(a[:1,:1,:4:2])  # tensor([[[1.4013e-45, 0.0000e+00]]])
print(a[:1,:1,:4:2].shape)  # torch.Size([1, 1, 2])

tensor切片2

a = torch.FloatTensor(2,3,4)
print('a = ', a)  #a =  tensor([[[ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [-1.2391e-11,  3.0756e-41,  0.0000e+00,  0.0000e+00]],

                            # [[ 1.4013e-45,  0.0000e+00,  1.6816e-44,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                            # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00]]])
print(a.shape)  # torch.Size([2, 3, 4])
print(a.index_select(0, torch.arange(1)))  # tensor([[[ 1.4013e-45,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                                                    # [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
                                                    # [-1.2391e-11,  3.0756e-41,  0.0000e+00,  0.0000e+00]]])
print(a.index_select(0, torch.arange(1)).shape)  # torch.Size([1, 3, 4])
print(a.index_select(1, torch.arange(2)))  # tensor([[[1.4013e-45, 0.0000e+00, 0.0000e+00, 0.0000e+00],
                                                    # [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]],

                                                    # [[1.4013e-45, 0.0000e+00, 1.6816e-44, 0.0000e+00],
                                                    # [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]]])
print(a.index_select(1, torch.arange(2)).shape)  # torch.Size([2, 2, 4])
print(a.index_select(2, torch.arange(3)))  # tensor([[[ 1.4013e-45,  0.0000e+00,  0.0000e+00],
                                                    # [ 0.0000e+00,  0.0000e+00,  0.0000e+00],
                                                    # [-1.2391e-11,  3.0756e-41,  0.0000e+00]],

                                                    # [[ 1.4013e-45,  0.0000e+00,  1.6816e-44],
                                                    # [ 0.0000e+00,  0.0000e+00,  0.0000e+00],
                                                    # [ 0.0000e+00,  0.0000e+00,  0.0000e+00]]])
print(a.index_select(2, torch.arange(3)).shape)  # torch.Size([2, 3, 3])

tensor类型转换

t1 = torch.LongTensor(3, 5)
print(t1.type())  # torch.LongTensor
# 转换为其他类型
t2=t1.type(torch.FloatTensor)
print(t2.type())  # torch.FloatTensor

在下一个学习中主要练习一下tensor的维度变换,这在深度学习图像领域是经常使用到的操作,所以也是必须掌握的技能。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值