PyTorch-使用张量表征实际数据

处理图像

图像被表示为一个排列在具有高度和宽度的规则网格的标量集合中,其中高度和宽度以像素为单位。每个网格点(像素)可能有一个标量,它将被表示为一个灰度图像;或者每个网格点有多个标量,这时每个标量通常会呈现不同的颜色,或不同的特征。

加载图像文件

图像有几种不同的文件格式,但在Python中有很多加载图像的方法。让我们从使用imageio模块加载PNG格式图像开始

import  imageio
img_arr=imageio.imread('/home/user1/QinRui/learn-dataset/dog.jpg')
print(img_arr.shape)
#输出
(500, 800, 3)

此时,img是一个具有3个维度的类NumPy数组对象:2个空间维度尺寸——宽度和高度,第3个维度对应红色、绿色和蓝色通道。任何输出NumPy数组的库都可以获得一个PyTorch张量,唯一需要注意的是维度布局。处理图像数据的PyTorch模块要求张量排列为C×H×W(分别表示通道、高度和宽度)。

改变布局

我们可以用张量的permute()方法使每个新的维度利用旧维度得到一个合适的布局。给定一个已知的H×W×C的输入张量,我们布局不同通道,从而得到一个合适的布局

img=torch.from_numpy(img_arr)
out=img.permute(2,0,1)
print(out.shape)
# 输出
torch.Size([3, 500, 800])

注意该操作并没有复制张量数据,而是让out使用与img相同的底层存储,并且在张量级别处理大小和步长信息。
创建一个多图像的数据集作为神经网络的输入,沿着第一维批量存储图像,以获得一个N×C×H×W的张量。我们可以预先分配一个适当大小的张量,并使用从目录加载的图像填充它。

batch_size=3
batch=torch.zeros(batch_size,3,256,256,dtype=torch.uint8) # 批处理将由3幅高度256像素、宽度256像素的RGB图像组成。
# 注意张量的类型:期望每种颜色都以8位整数表示
'''
从一个输入目录中加载所有的PNG图像,并将它们存储在张量中
'''
import os
data_dir='/home/user1/QinRui/learn-dataset/image-cats'
filenames=[name for name in os.listdir(data_dir)
           if os.path.splitext(name)[-1]=='.png']
for i,filename in enumerate(filenames):
    img_arr=imageio.imread(os.path.join(data_dir,filename))
    img_t=torch.from_numpy(img_arr)
    img_t=img_t.permute(2,0,1)
    img_t=img_t[:3]# 只保留前3个通道,有时图像还有一个表示透明度的alpha通道,但我们只需要RGB输入
    batch[i]=img_t

print(batch.shape)  # torch.Size([3, 3, 256, 256])

表示表格数据

我们在机器学习作业中遇到的最简单的数据形式是电子表格、CSV文件或数据库。无论介质是什么,它都是一张表,每行包含一个样本或记录,其中的列包含关于样本的一部分信息。

使用真实的数据集

葡萄酒质量数据集是一个免费的表格数据集,它包含葡萄牙北部葡萄酒的化学特征以及感官质量评分。

加载葡萄酒数据张量
'''
加载文件并将生成的numpy数组转换为pytorch张量
'''
import csv
wine_path="/home/user1/QinRui/learn-dataset/winequality-white.csv"
wine_numpy=np.loadtxt(wine_path,dtype=np.float32,delimiter=";",skiprows=1)
# 这里我们规定了二维数组的类型和用于分隔每行数据的分隔符,并约定不读取第1行,因为第1行是列名。
print(wine_numpy)
col_list=next(csv.reader(open(wine_path),delimiter=';'))
wine=torch.from_numpy(wine_numpy)# 得到一个浮点数的torch.Tensor对象,它包含所有列。
表证分数

我们可以将分数视为一个连续变量,把它当作一个实数,然后执行回归任务,或者将其视为一个标签,并尝试在分类任务中根据化学特征分析猜测标签。

data=wine[:,:-1]# 选择所有行和除最后一列以外的所有列
target=wine[:,-1]# 选择所有行和最后一列
'''
2种方法将target张量转换为标签张量
'''
target=wine[:,-1].long()#简单地将标签视为分数的整数向量
### 另一种方法是构建独热编码(one-hot encoding),即将10个分数分别编码到一个由10个元素组成的向量中。
target_onehot=torch.zeros(target.shape[0],10)
target_onehot.scatter_(1,target.unsqueeze(1),1.0)# 使用scatter_()方法获得一个独热编码。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值