3pytorch读入各类形式的数据(代码片段)

王小小小草 王小小小草     2022-12-10     252

关键词:

欢迎订阅本专栏:《PyTorch深度学习实践》
订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html

  • 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
  • 第三章:学习PyTorch如何读入各种外部数据
  • 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
  • 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
  • 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
  • 第七章利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
  • 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。

在现实场景中,数据由很多种形式存在,如存在表格中的数据、时间序列数据、图像数据、视频数据、文本数据等。在使用pytorch建立深度学习模型前,无论什么样的数据我们都要转换成tensor的形式, 并做好预处理,为喂入模型做准备。因此本章的主要内容是讲解如何读入各类数据、转换成tensor、并预处理好的过程。

3.1 表格式数据

数据形式:
表格式数据是比较常见的数据形式,一般存放再excel, csv, database中。其每一行是一个样本,每一列是样本的一个特性,每个样本之间是独立的即行与行之间没有顺序关系(和时间序列数据的最大差异)。

数据类型:
每一列的特性在表格类数据类型都可能不同,比如“温度”是数值型,“颜色”是字符串。
而一个pytorch tensor中的数值类型都是需要相同的,因此这就需要转换了。

读入数据:
常用的方法有:csv module, NumPy, Pandas
使用Pandas在时间和内存上都较为高效,但由于本文在将pytorch, 且前文也提到了与NumPy的交互,因此这里先介绍Numpy获取:

import numpy as np

path = "data.csv"
data = np.loadtxt(path, dtype=np.float32, delimiter=",")

检查数据:
可以通过这种方式检查数据大小,和列名

import csv

col_list = next(csv.reader(open(path), delimiter=','))

print(data.shape)
print(col_list)

转换成tensor:

import torch
data = torch.from_numpy(data)

print(data.shape)
print(data.type)

预处理数据:
现在数据以tensor形式存在,但还不可以直接喂给模型,需要做一些预处理。
(1)分割特征集与标签

features = data[:, :-1]
label = data[:, -1]

(2)处理label的格式
若是进行连续变量的预测则label应为浮点型数据, 若是进行分类模型则label需要转换成One-hot格式。

# 预测时:
label_long = data[:, -1].long()

# 分类时:
label_onehot = torch.zeros(label_long.shape[0], 10) # 构建N*C的矩阵,N为样本数量,C为类别数量
label_onehot.scatter_(1, label_long.unsqueeze(1), 1.0)
  • scatter_有下划线,表示是在原tensor上进行直接操作,操作后的结果将代替原tensor
  • scatter中的参数,1表示是在维度为1上做操作;第2个参数指在该索引上填充值;第3个参数指填充值为1.0
  • unsqueeze(1)指增加一个维度

(3)标准化特征
特征的数值范围悬殊会导致建模的不准确性,需要将每个特征都进行标准正态分布的转换。

features_mean = torch.mean(features, dim=0)
features_var = torch.bar(features, dim=0)

features_norm = (features - features_mean) / torch.sqrt(features_var)

3.2 文本类数据

数据形式:
由N行文本组成,一般每行是一篇文章或一个句子。如

我 是 中 国 人
我 爱 我 的 祖 国

读入数据

with open(path, 'r', encoding='utf-8') as f:
    line = f.read()

清理与预处理数据:


def clean(s):
    punctuation = '.,:"!?“”_-'
    word_list = s.lower().replace('\\n', '').split()
    word_list = [word.strip(punctuation) for word in word_list]
    return word_list

words_in_line = clean(line)

构建词典:

word_list = sorted(set(clean(line)))
word2index_dict = word: i for (i, word) in enumerate(word_list)

构建one-hot编码:
文字应根据词典转换成对应的one-hot形式。

word_tensor = torch.zeros(len(words_in_line), len(word2index)_dict) # 创建一个矩阵存放one-hot向量
for i, word in enumerate(words_in_line):
    word_index = word2index_dict[word]
    word_tensor[i][word_index] = 1  # 将对应位置上的值改为1.

构建text embedding:
one-hot存在维度爆炸影响模型训练与向量之间无含义关联等缺点。目前常用都是使用嵌入式词向量,如word2vec, glove, elmo等通过大语料上的训练得到词向量。

3.3 图像类数据

数据形式:
图像是以长,高,颜色通道三类信息组成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuTm5Zyd-1581678968312)(./image/7.png)]

读入一张图像:

import imageio

# 读入以array格式存储
img_arr = imageio.imread('image.jpg')
print(ima_arr.shape)  # (720, 1280, 3)

# 转换为tensor
img = torch.from_numpy(img_arr)

# 维度更换为C*H*W
out = torch.transpose(img, 0, 2)

读入一批图像:

import os

batch_size = 100
batch = torch.zeros(100, 3, 256, 256, dtype=torch.unit8)

data_dir = "data/"
filenames = [name for name in os.listdir(data_dir) if os.path.splittext(name) == '.png']
for i, filename in enumarate(filenames):
    img_arr = imageio.imread(filename)
    batch[i] = torch.transpose(torch.from_numpy(img_arr), 0, 2)

batch的大小:(batch_size, C, H, W),这个数据形式一般可以直接进入模型训练了。

标准化:
(1)归一化

batch = batch.float()
batch /= 255.0

(2)标准正态分布化

n_channels = batch.shape[1]
for c in n_channels:
    mean = torch.mean(batch[:, c])
    std = torch.std(batch[:, c])
    batch[:,c] = (batch[:,c] - mean) / std

3.4 立体数据

数据形式:
所谓立体数据即有多张图片组成的数据,如医院里的CT影像,如视频(由多帧图片组成)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3DrjjSP-1581678968314)(./image/8.png)]
但其实,立体数据只是比图像数据要多一个维度而已,N个立体数据的大小为:NCDHW,其中D是数据的深度,若包含三张图片则深度为3.

数据读入:

dir_path = 'data/xxx'
vol_arr = imageio.volread(dir_path)
print(vol_arr.shape)  # (99,512,512)

# 转换
vol = torch.from _numpy(vol_arr)
vol = torch.transpose(vol, 0, 2)  # (512, 512, 99)
vol = torch.unsequeeze(vol, 0)   # (1, 512, 512, 99)

[是模板哦]快速读入(代码片段)

原理(大概是)getchar()比scanf()和cin都要快利用非常快的读入函数getchar(),一位一位将数字以字符形式读入,若读入的字符不为数字则结束,首先判断要读入的数字的正负,之后每读入一个字符就将字符转化为数字并*10然后加上... 查看详情

flume入门(代码片段)

...变为一个纯粹的传输工具。Flume-ng另一个主要的不同点是读入数据和写出数据现在由不同的工作线程处理(称为Runner)。在Flume-og中,读入线程同样做写出工作(除了故障重试)。如果写出慢的话(不是完全失败),它将阻塞Flume... 查看详情

sparkspark对数据的读入和写出操作(代码片段)

Spark对数据的读入和写出操作数据存储在文件中CSV类型文件JSON类型文件Parquet操作分区操作数据存储在Hive表中数据存储在MySQL中数据存储在文件中在操作文件前,我们应该先创建一个SparkSessionvalspark=SparkSession.builder().master(&#... 查看详情

c++中文件最后一个字符不能读入问题的解决(代码片段)

在做一个实验的时候,需要将文件中的数据逐行读入,在读入的时候遇到了一个问题,前面几行的数据读入正常,最后一行数据的读入会少一个数据,数据格式如下   注意箭头处,这里是文件的末尾了,前面的数据之... 查看详情

python将文本文件读入2d阵列并访问数据(代码片段)

我试图将文本文件中的数据读入2D数组,然后访问数据的每个元素。我尝试了许多不同的方法,但我无法访问数据的每个元素,这是数据的摘录,GRID167.55.9615390.GRID177.511.923080.GRID187.517.884610.GRID197.523.846150.GRID207.529.807690.GRID217.535.76... 查看详情

各类数值型数据间的混合运算(代码片段)

文章目录整型、实型、字符型数据间可以混合运算1.自动转换1.1.运算转换规则:例如:2.强制转换2.1.例如整型、实型、字符型数据间可以混合运算1.自动转换发生自动转换的情况:运算转换------不同类型数据混合运算时赋... 查看详情

各类数值型数据间的混合运算(代码片段)

文章目录整型、实型、字符型数据间可以混合运算1.自动转换1.1.运算转换规则:例如:2.强制转换2.1.例如整型、实型、字符型数据间可以混合运算1.自动转换发生自动转换的情况:运算转换------不同类型数据混合运算时赋... 查看详情

qt中的qdebug()(代码片段)

...ty[0][2]);//(%d表示整数)输出结果:intensity:195//注:%a,%A//读入一个浮点值(仅C99有效)  %c//读入一个字符  %d//读入十进制整数  %i//读入十进制,八进制,十六进制整数  %o//读入八进制整数  %x,%X//读入十六进制整数 ... 查看详情

各类变量生存周期及存储空间(代码片段)

 一、运行时环境简介 程序在执行期间,将在其自己的逻辑地址空间内运行,其中每个程序值都在这个空间内有一个地址。一种典型的程序空间模式如下图: 首先,运行时的数据包含数据区和代码区。图中的Text就是... 查看详情

常用模板——对拍(代码片段)

...( ext.bat)形式的对拍程序。码量比较少,但是需要写文件读入读出。当程序( exterror)的时候,不会突出显示。所以时不时要看一眼。出错的数据也不会输出。下面程序中,( extdata)是数据生成器,( exttest)是你的考场程序,( extright)... 查看详情

英语中各类词性的基本概念(代码片段)

英语中的十大词性英语中名词的基本概念名词(Nouns)是英语中的一类词汇,它们表示人、地点、事物、动物、观念或抽象概念。简而言之,名词是我们用来给事物命名的词。名词在句子中可以扮演不同的角色ÿ... 查看详情

spark直接读入fastq格式的数据(代码片段)

输入文件:fastq格式输出结果:kmer的频数和对应的kmer类型系统环境Ubuntu单机版17.01spark版本2.7此次测试主要用到了RDD的函数foreach和zipWithIndex,zipWithIndex这个函数是可以直接对gz文件进行操作的python的主要通过lambda函数来进行操作... 查看详情

beego中各类数据库连接方式(代码片段)

beego框架是优秀得goRESTAPI开发框架。下面针对beego中各类数据库连接操作做一个总结。1.orm连接方式beego中的orm操作支持三种数据库:mysql,sqlite3,postgersql。三种数据库的驱动如下:import(_"github.com/go-sql-driver/mysql"_"github.com/lib/pq"_"githu... 查看详情

循环右移(代码片段)

...右移操作,右移后仍然是无符号整数。编写程序从控制台读入要右移的整数和循环右移的位数,求得并输出循环右移后的十进制数据。【输入形式】从控制台输入要右移的十进制整数(大于等于0,小于等于65535)和循环右移的位... 查看详情

数据库命名规范之全局查找各类命名(代码片段)

SELECT*FROMinformation_schema.columnsWHEREcolumn_namelike‘%teaching_center_id%‘andTABLE_SCHEMA="zykydb_modify"ORDERBYTable_nameasc;查找数据库相关联的列名。SELECT*FROMinformation_schema.INNODB_SYS_INDEXESWHERE`NAM 查看详情

flume原理分析与使用案例(代码片段)

...量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力。flume的数据流由事件(Event)贯穿始终。Event是... 查看详情

地铁线路最短路径(代码片段)

1.问题需求将地铁线路保存成一个可读入,简洁明了的文本程序能正确读入这个文件,并获取地铁线路信息程序能正确处理输入的命令行程序能正确输出指定地铁线经过的站点程序能正确输出两个站点间的最短路径(未完全实现... 查看详情

flume的介绍和简单操作(代码片段)

...志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。Flume的功能支持在日志系统中定制各类数据发送方,用于... 查看详情