第四章 使用张量表征真实数据(1)

最近高产似那啥~

话不多说,直接开始

本书第一部分的代码和一些用到的数据:

链接(阿里云盘):

「Pytorch DeepLearning」https://www.aliyundrive.com/s/wQmXYZSqyv4 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

本章主要内容

1.将真实数据表示为Pytorch张量。

2.处理一系列数据类型。

3.从文件加载数据。

4.将数据转换为张量。

5.塑造张量,使之作为神经网络的输入。

本文先介绍一部分。截止葡萄酒品质鉴定那里。

4.1 处理图像

1.加载图像文件

###4.1.2 加载图像文件
import imageio
import torch
img_arr = imageio.imread('D:\\DeepLearning data\\data\\p1ch4\\image-dog\\bobby.jpg')
print(img_arr)
print(img_arr.shape)

输出:

2.改变布局

###4.1.3 改变布局
img = torch.from_numpy(img_arr)
out = img.permute(2,0,1)#permute()函数对通道进行重排CxHxW—>HxWxC
print(out)

###预先分配一个适当大小的张量,并使用从目录中加载的图像填充它
batch_size = 3
batch = torch.zeros(batch_size, 3, 256, 256, dtype=torch.uint8)  ####(3,3,256,256)张量
import os
data_dir = 'D:\\DeepLearning data\\data\\p1ch4\\image-cats'
filenames = [name for name in os.listdir(data_dir)  ####os.listdir()返回指定路径下的文件和文件夹列表
            if os.path.splitext(name)[-1]=='.png']  ####仅挑选.png文件  os.path.splitext() 分离文件名与扩展名
for i ,filename in enumerate(filenames):
    img_arr = imageio.imread(os.path.join(data_dir,filename))  ####os.path.join()用于路径拼接文件路径;只是起到连接文件的作用,而不能生成文件
    img_t = torch.from_numpy(img_arr)
    img_t = img_t.permute(2, 0, 1)
    img_t = img_t[:3]
    batch[i] = img_t
print(batch)

 输出:

3.正规化数据

batch = batch.float()
batch /= 255.0  ###将数据归一到[0,1]
print(batch)

###另一种方法(0均值,1标准差)
###预先分配一个适当大小的张量,并使用从目录中加载的图像填充它
batch_size = 3
batch = torch.zeros(batch_size, 3, 256, 256, dtype=torch.uint8)  ####(3,3,256,256)张量
import os
data_dir = 'D:\\DeepLearning data\\data\\p1ch4\\image-cats'
filenames = [name for name in os.listdir(data_dir)  ####os.listdir()返回指定路径下的文件和文件夹列表
            if os.path.splitext(name)[-1]=='.png']  ####仅挑选.png文件  os.path.splitext() 分离文件名与扩展名
for i ,filename in enumerate(filenames):
    img_arr = imageio.imread(os.path.join(data_dir,filename))  ####os.path.join()用于路径拼接文件路径;只是起到连接文件的作用,而不能生成文件
    img_t = torch.from_numpy(img_arr)
    img_t = img_t.permute(2, 0, 1)  ###pytorch需要张量排列(CxHxW)转变为(3,256,256)
    img_t = img_t[:3]
    batch[i] = img_t
print(batch)
batch = batch.float()
print(batch.shape)
n_channels = batch.shape[1]
for c in range(n_channels):###只保留前三个通道
    mean = torch.mean(batch[:,c])
    std = torch.std(batch[:,c])
    batch[:,c] = (batch[:,c] - mean)/std
print(batch)
print(batch.shape)

 输出:

4.2 三维图像:体数据

#4.2 三维图像:体数据
###加载特定格式  使用imageio模块中的volread()函数加载一个CT扫描样本,该函数将目录作为参数
import imageio
dir_path = 'D:\\DeepLearning data\\data\\p1ch4\\volumetric-dicom\\2-LUNG 3.0  B70f-04083'
vol_arr = imageio.volread(dir_path,'DICOM')
print(vol_arr.shape)
#####shape(99,512,512)不包含通道信息,因此需要使用unsqueeze()函数为通道维数留出空间
vol = torch.from_numpy(vol_arr).float()
vol = torch.unsqueeze(vol,0)##对数据维度进行扩充。给指定位置加上维数为一的维度
print(vol.shape)

 输出:

 4.3 表示表格数据

Pytorch提供了几种加载csv文件的方法,最常用的三种是:Python自带的CSV模块、numpy、pandas.

本次使用numpy

1.读取数据

###葡萄酒评分
import csv
import numpy as np
wine_path = 'D:\\DeepLearning data\\data\\p1ch4\\tabular-wine\\winequality-white.csv'
wine_numpy = np.loadtxt(wine_path, dtype=np.float32, delimiter=";",skiprows=1)  ###skiprows=1表示不读第一行,因为其中包含列名
print(wine_numpy)
wine_tensor = torch.from_numpy(wine_numpy)
print(wine_tensor.shape,wine_tensor.dtype)

输出:

###表示分数
data = wine_tensor[:,:-1]###最后一列是分数,不输入模型
print(data,data.shape)
target = wine_tensor[:,-1].long()###转换为标签张量
print(target,target.shape)

 输出:

2.独热编码

使用scatter_()方法获得独热编码,该方法将沿着参数提供的索引方向将源张量的值填充进输入张量中

scatter_()  下划线表示该方法不会返回一个新的张量,而是在适当的位置修改原张量
scatter_(input, dim, index, src) → Tensor
将src中的所有值按照index确定的索引写入本tensor中。其中索引是根据给定的dimension,dim按照gather()描述的规则来确定。
参数:- input (Tensor)-源tensor
      -dim (int)-索引的轴向
      -index (LongTensor)-散射元素的索引指数
      -src (Tensor or float)-散射的源元素

###独热编码
###使用scatter_()方法获得独热编码,该方法将沿着参数提供的索引方向将源张量的值填充进输入张量中
target_onehot = torch.zeros(target.shape[0],10)
target_onehot.scatter_(1, target.unsqueeze(1), 1.0)
print(target_onehot,target_onehot.shape)
'''
scatter_()  下划线表示该方法不会返回一个新的张量,而是在适当的位置修改原张量
scatter_(input, dim, index, src) → Tensor
将src中的所有值按照index确定的索引写入本tensor中。其中索引是根据给定的dimension,dim按照gather()描述的规则来确定。
参数:- input (Tensor)-源tensor 
      -dim (int)-索引的轴向 
      -index (LongTensor)-散射元素的索引指数 
      -src (Tensor or float)-散射的源元素
参数:
指定表示要散射的元素的索引张量;

'''

输出:

 另一种独热编码方式:

##感觉有点难理解,决定使用另一种方法
import torch.nn.functional as F
target_onehot1 = F.one_hot(target)
print(target_onehot1,target_onehot1.shape)

输出:

结果一样~

3.处理数据

'''
dim=0为第0个维度,代表行。对于torch.mean(s,dim=0),表示跨行求平均。
'''
###处理张量表格数据
data_mean = torch.mean(data, dim=0)
print(data_mean,data_mean.shape)
data_var = torch.var(data, dim=0)
print(data_var,data_var.shape)
data_normalized = (data - data_mean)/torch.sqrt(data_var)
print(data_normalized,data_normalized.shape)

输出:

    

###寻找阈值  寻求一种简单方法快速分辨酒的好坏 例如分数小于等于3的即为劣质酒
bad_indexes = target <= 3
print(bad_indexes,bad_indexes.shape,bad_indexes.dtype,bad_indexes.sum())###布尔型数据
bad_data = data[bad_indexes]
print(bad_data,bad_data.shape)

 输出:

###分为好中劣三等
bad_data = data[target <= 3]
mid_data = data[(target > 3) & (target < 7)]
good_data = data[target >= 7]
###对每一列取均值
bad_mean = torch.mean(bad_data,dim=0)
mid_mean = torch.mean(mid_data,dim=0)
good_mean = torch.mean(good_data,dim=0)
for i, args in enumerate(zip(col_list,bad_mean,mid_mean,good_mean)):
    print('{:2} {:20} {:6.2f} {:6.2f} {:6.2f}'.format(i,*args))

###使用二氧化硫总量的阈值来区分酒的好劣
total_sulfur_threshold = 141.83
total_sulfur_data = data[:,6]
predicted_indexes = torch.lt(total_sulfur_data,total_sulfur_threshold)##torch.lt(input,other)逐元素比较input和other即是否 input<other;返回bool型
print(predicted_indexes,predicted_indexes.dtype,predicted_indexes.shape,predicted_indexes.sum())

输出:

###得到真正好酒的索引
actual_indexes = target > 5
print(actual_indexes.shape,actual_indexes.dtype,actual_indexes.sum(),actual_indexes)

输出:

###检验预测与实际结果是否相符
n_matches = torch.sum(actual_indexes & predicted_indexes).item()###。item()方法 	将数组元素复制到标准Python标量并返回它。
n_predicted = torch.sum(predicted_indexes).item()
n_actual = torch.sum(actual_indexes).item()
print(f'预测得到的优质酒数量:',n_matches)
print(f'2700瓶中的预测准确率:',n_matches/n_predicted)
print(f'整个数据集中的预测准确率:',n_matches/n_actual)

 输出:

OK,先写到这,太多了也没人看(反正也没人看) 记得看完点个赞~(磕头辣)

所需的文件还在整理,最后附上链接,或者私信我获取~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值