第四章 使用张量表征真实数据(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,先写到这,太多了也没人看(反正也没人看) 记得看完点个赞~(磕头辣)
所需的文件还在整理,最后附上链接,或者私信我获取~
第四章 使用张量表征真实数据(1)相关推荐
- 第四章 数据库和SQL 4-3 数据的更新(UPDATE语句的使用方法)
一.UPDATE语句的基本语法. 二.指定条件的UPDATE语句(搜索型UPDATE) 三.使用NULL进行更新 NULL清空:使用UPDATE可以将列更新为NULL,俗称NULL清空. 四.多列更新 ...
- python第四章课后答案4.7_Python数据分析实战作业 第四章 Python数据分析实战 习题...
第四章 Python数据分析实战 习题(数据见附件sizhang.xlsx) 班主任现有一班级的两张表,如下. 表一:成绩表 学 号C#线 代Python 16010203788896 表二:信息表 ...
- 第四章第二节数据资产盘点-数据资产盘点方法伦
第四章第二节数据资产盘点-数据资产盘点方法伦 数据资产盘点可以通过业务角度的自上而下演绎和数据角度的自下而上归纳对数据资产进行盘点,编制数据资产目录 ,如图所示: 自上而下的演绎,是确保数据资产目录可 ...
- c语言程序构造数据类型问题,C语言程序设计课程课件之第四章简单构造数据类型.ppt...
C语言程序设计课程课件之第四章简单构造数据类型 第四章 简单构造数据类型 目录 4.1 一维数组 4.2 二维数组 4.3 字符数组 4.4 数组与指针 4.5 数组及指针作为函数参数 4.1 一维数 ...
- knockoutjs ajax分页,KnockoutJS 3.X API 第四章之数据控制流foreach绑定
foreach绑定 foreach绑定主要用于循环展示监控数组属性中的每一个元素,一般用于table标签中 假设你有一个监控属性数组,每当您添加,删除或重新排序数组项时,绑定将有效地更新UI的DOM- ...
- mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 使用Select语句返回的数据,可能会发现显 ...
- Android 应用开发(第四章)---APP数据埋点
手把手教你进行APP数据埋点 经过大半年的努力,产品终于开始趋向稳定,之前的版本一直在探索,需求经常改动,没时间系统进行埋点.随着产品的稳定以及工作的深入,越发认识到数据的重要性,所以开始着手数据埋点 ...
- 第三,四章 数据库和数据表的(增删改查,重命名等)基本操作
第三章 数据库的基本操作 第一节:数据库简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库: 第二节:显示所有数据库 Show databases; 第三节:创建数据库 Cre ...
- 第四章第九节数据资产盘点-数据资产目录分类
第四章第九节数据资产盘点-数据资产目录分类 在形成数据资产清单以后,如何将清单进行分类?关于数据资产目录的分类,有几种方法,一是参考行业数据分类框架.二是参考监管数据分类.三是根据数据管理实践,结合企 ...
最新文章
- c语言simpson积分计算方法,数值分析复化Simpson积分公式和复化梯形积分公式计算积分的通用程序...
- Windows Live Messenger 8.5 抢先试用
- LAMP架构(apache与php结合,apache默认虚拟主机)
- 十四、Canny边缘提取
- 这就是深度学习如此强大的原因
- 一撕得:全员参与低代码开发,全面实现企业数字化管理
- 手机号码归属地查询接口大全
- 学习document.location.href和document.location.replace 区别
- mybatis添加数据时返回主键 insert 返回主键值
- 2019中兴捧月·总决赛心得
- 了解HTTP和HTPS的S之差
- 阿里无线11.11 | 手机淘宝主会场实践之路
- 聊一聊以前公司的测试流程
- 解决引用百度地图点击详情无法定位到相应位置问题
- 认真推荐几个高质量的原创公众号
- Android事件总线 EventBus3.0用法学习
- 第一次考CSP(第27次CCF计算机软件能力认证)
- 【点云处理之论文狂读经典版9】—— Pointwise Convolutional Neural Networks
- Python GPU加速
- C++读取局域网内其他计算机共享文件夹的文件