pytorch第01天 数据类型

1 pytorch中的常用数据类型

32位浮点型:torch.FloatTensor。
64位整型:torch.LongTensor。
32位整型:torch.IntTensor。
16位整型:torch.ShortTensor。
64位浮点型:torch.DoubleTensor。
布尔型:torch.BoolTensor。布尔型是8位,即一个字节。
除此之外,pytorch的其他数据类型不需要掌握。

如果要在CUDA中进行计算,那么要使用的数据类型是:
torch.cuda.FloatTensor
torch.cuda.LongTensor
torch.cuda.IntTensor
torch.cuda.ShortTensor
torch.cuda.DoubleTensor
torch.cuda.BoolTensor。
也就是说,在pytorch中,torch.FloatTensor和torch.cuda.FloatTensor分别属于不同的类。

2 数据的尺度与维度

(1)0维数据

pytorch 0.4以后的版本,将标量当成0维的数据,比如 torch.tensor(1.)就是标量,而torch.tensor([1.]),多了一对方括号的就是向量。

(2)1维数据

由一对方括号括起来的,就是向量,比如torch.tensor([1, 2, 3]),torch.tensor([1])

(3)2维数据

由两对方括号括起来的,就是矩阵,如
torch.tensor([[1, 2, 3], [4, 5, 6]])
如果a是二维的,那么a[0,0]就是标量,即0维的,并非长度为1的一维向量。

import torch
a = torch.rand(2,3)
print(a[1, 0])      # 具体到元素,那就是标量,而非长度是1的一维向量
print(a.size(1))    # 输出a的第二个维度的长度,和 a.shape[1] 等效
# print(a.shape(1)) # 这么写会报错,应该是 a.shape[1]
# 和numpy不一样的是,torch中只有shape属性,没有shape函数

输出

tensor(0.3593)
3

具体到元素了,不管是几维,结果都是标量。可以用a.size(1)输出第二个维度的长度。
同理,也有4维,5维和更高维度的数据,用几个方括号,就是几维。

0维,1维,2维数据的size

c = torch.tensor(1.)
print(c.shape)

d = torch.tensor([1.])
print(d.shape)

e = torch.tensor([1., 2., 3.])
print(e.size())

f = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(f.size())

输出

torch.Size([])
torch.Size([1])
torch.Size([3])
torch.Size([2, 3])

注意,torch.Size([1])和torch.Size([3])都是向量的尺寸,括号里面的1和3表示向量的长度。

3 获取数据的维度数、形状、元素个数等信息

使用.dim()函数,可以返回数据是几维的,
调用.shape属性,或者.size()方法都可以返回张量的维度,
调用.numel()函数,可以返回张量中元素的总个数

import torch
a = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.dim())
print(a.size())
print(a.shape)
print(a.numel())

输出

tensor([[1, 2, 3],
        [4, 5, 6]])
2
torch.Size([2, 3])
torch.Size([2, 3])
6

4 用.type()返回张量的数据类型

print(a.type())
print(type(a))

输出

torch.LongTensor
<class 'torch.Tensor'>

也就是说,type(a)返回的是a在python中的数据类型,a.type()返回的是a在torch中的数据类型。

5 初始化张量.tensor(),.FloatTensor(),.Tensor()的区别

使用.tensor()是用现成的数据初始化一个张量出来,张量的数据类型根据括号中的数据类型来确定。

import torch
'''使用tensor函数初试化一个函数,
如果初始化值中,全部为整数,那么生成的张量就是LongTensor
只要有一个元素为浮点型,生成的张量就是FloatTensor'''

a = torch.tensor([2, 3, 4])
print(a.type())

b = torch.tensor([2., 3])
print(b.type())

输出

torch.LongTensor
torch.FloatTensor

也可以使用
DoubleTensor(),.FloatTensor(),.IntTensor(),.LongTensor()来生成具体类型的数据,如果括号中的数据类型不符合要求,强制类型转换

a = torch.FloatTensor([[1, 2, 3], [4, 5, 6]])
print(a)
print(a.type())

输出

tensor([[1., 2., 3.],
        [4., 5., 6.]])
torch.FloatTensor

DoubleTensor(),.IntTensor(),.LongTensor()的用法也和.FloatTensor()一样

上述方法很少使用,因为.FloatTensor()经常是用来生成某个特定维度的数据,在括号中指定维度,实现某个张量的初始化,如

b = torch.FloatTensor(2, 3)
print(b)
print(b.type())

输出

tensor([[9.5461e-01, 4.4377e+27, 1.7975e+19],
        [4.6894e+27, 7.9463e+08, 5.0944e-14]])
torch.FloatTensor

此外,.Tensor()也是用来生成某个特定维度的数据,其数据类型是默认的数据类型,假如默认的数据类型是FloatTensor,那么生成的张量,其数据类型就是FloatTensor,如

c = torch.Tensor(2, 3)
print(c)
print(c.type())

输出

tensor([[1.7181e+19, 4.4166e+21, 1.1259e+24],
        [1.0894e+27, 1.4603e-19, 1.6795e+08]])
torch.FloatTensor

也可以改变torch的默认数据类型,使用函数.set_default_tensor_type()

torch.set_default_tensor_type(torch.DoubleTensor)

综合上面的,可以看到,.tensor(data)是把现成的数据转化为张量,而.FloatTensor(shape)和.Tensor(shape)是生成某个特定维度的张量。

6 张量的长度

利用python中的内置函数len,可以测量张量第一个维度的长度(即“一级子目录”的数量),相当于size(0),但len返回的是一个纯数字

a = torch.rand(50, 8)
b = torch.rand(2, 5, 6)
print(len(a))
print(len(b))

输出

50
2

7 numpy数组与pytorch的tensor的转化

(1)numpy转化为tensor

a 使用torch.from_numpy()函数(共享内存)

import numpy as np
import torch

a = np.arange(10).reshape(2, 5)
b = torch.from_numpy(a)
a[1, 3] = 100
print(a)
print(b)

输出

[[  0   1   2   3   4]
 [  5   6   7 100   9]]
tensor([[  0,   1,   2,   3,   4],
        [  5,   6,   7, 100,   9]], dtype=torch.int32)

b 使用torch.tensor()(拷贝一份,不共享内存)

import numpy as np
import torch

a = np.arange(10).reshape(2, 5)
# b = torch.from_numpy(a)
b = torch.tensor(a)
a[1, 3] = 100
print(a)
print(b)

输出

[[  0   1   2   3   4]
 [  5   6   7 100   9]]
tensor([[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]], dtype=torch.int32)

(2)将tensor转化为numpy

a 使用torch.numpy(ndarray)(共享内存)

b 使用np.array(torch.tensor)(拷贝一份,不共享内存)

import numpy as np
import torch
b = torch.arange(10).reshape(2, 5)
c = b.numpy()
d = np.array(b)
b[1, 3] = 100
print(20*'-','b', 20*'-')
print(b)
print(20*'-','c', 20*'-')
print(c)
print(20*'-','d', 20*'-')
print(d)

输出

-------------------- b --------------------
tensor([[  0,   1,   2,   3,   4],
        [  5,   6,   7, 100,   9]])
-------------------- c --------------------
[[  0   1   2   3   4]
 [  5   6   7 100   9]]
-------------------- d --------------------
[[0 1 2 3 4]
 [5 6 7 8 9]]

8 Python知识补充

(1)isinstance()

isinstance(a, FloatTensor)	判断数据a是否为FloatTensor类

(2)enumerate()

enumerate()函数 可以给原来的列表、元组、字符串带上索引,变成枚举类型。可以用list函数将枚举类型对象转换成列表。
在这里插入图片描述

(3)iter()与next()

这两种方法经常一起使用

next(iterable[, default])

iterable – 可迭代对象,得是用iter方法封装后的容器
default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

输出

1
2
3
4
5

8 总结

(1)本课回顾

1 pytorch的常用数据类型(张量类型)有哪些?CUDA中的类型有哪些?
2 数据的维度数是什么意思,它和size的差别是什么?0维数据怎么生成?
如果a是二维的,那么a[0,0]是标量还是长度为1的向量?具体到元素的,都是标量
如何获取a中第二个维度的长度?
3 如何获取数据的维度数、形状、元素个数等信息
4 假如a是一个张量,那么type(a)和a.type()分别表示什么?
5 初始化张量.tensor(),.FloatTensor(),.Tensor()的用法区别
6 len(a)返回的是张量的元素总数,还是a的第一个维度的长度?
7 tensor与numpy如何实现互相转换(不共享内存)

(2)要求掌握

1 如何用[2, 3, 4]初始化一个张量?
  a = torch.tensor([2, 3, 4])
2 获得张量在pytorch中的数据类型
  a.type()
3 获得张量的形状
  a.shape或a.size()
4 读取张量指定位置的元素
  a = torch.rand(2,3)
  print(a[1, 0])
5 torch中有多少种数据类型?
  6种,三整两实加布尔
6 tensor与numpy相互转化(不共享内存)
  tensor——>numpy np.array()
  numpy——>tensor torch.tensor()

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PyTorch 中,可以通过封装数据集的方式来方便地进行数据加载和预处理。下面是一个简单的 PyTorch 数据集封装的示例代码: ``` python import torch from torch.utils.data import Dataset class MyDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, index): x = self.data[index][0] y = self.data[index][1] return torch.tensor(x), torch.tensor(y) ``` 在这个例子中,我们定义了一个名为 MyDataset 的数据集类,该类继承了 PyTorch 的 Dataset 类。在 MyDataset 类的构造函数中,我们传入了一个数据集 data;该数据集可以是一个列表、元组、Numpy 数组或 Pandas 数据帧等数据类型。 在 MyDataset 类中,我们还实现了两个方法:__len__ 和 __getitem__。其中,__len__ 用于返回数据集的长度,而 __getitem__ 用于获取数据集中指定索引位置的数据。在这个例子中,我们假设数据集 data 中每个样本是一个二元组,第一个元素表示输入数据,第二个元素表示标签。在 __getitem__ 方法中,我们将输入数据和标签分别返回为 PyTorch 的 tensor 类型。 有了 MyDataset 类之后,我们可以使用 PyTorch 中的 DataLoader 类来进行数据加载和批处理。下面是一个使用 MyDataset 类和 DataLoader 类的示例代码: ``` python from torch.utils.data import DataLoader # 假设我们有一个数据集 data data = [(1, 2), (3, 4), (5, 6), (7, 8)] # 创建 MyDataset 对象 dataset = MyDataset(data) # 创建 DataLoader 对象 dataloader = DataLoader(dataset, batch_size=2, shuffle=True) # 迭代 DataLoader 并输出数据 for batch_x, batch_y in dataloader: print(batch_x, batch_y) ``` 在这个例子中,我们首先创建了一个数据集 data,然后使用 MyDataset 类将其封装成一个 PyTorch 数据集对象 dataset。接着,我们使用 DataLoader 类将数据集 dataset 封装成一个数据加载器对象 dataloader。在创建 dataloader 对象时,我们指定了 batch_size=2 和 shuffle=True,表示每个批次的大小为 2,且在每个 epoch 开始时重新打乱数据集。最后,我们通过迭代 dataloader 对象来获取数据批次,并输出其内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值