数据操作
使用pytorch进行数据处理
source code: NJU-ymhui/DataOperations: Use pytorch for data operations (github.com)
use git to clone: https://github.com/NJU-ymhui/DataOperations.git
入门
pytorch
中的数组被称为张量(Tensor
),与numpy
中的ndarray
类似,但ndarray
仅支持CPU运算,而Tensor
同时可以很好地支持GPU加速运算,并且Tensor类支持自动微分。
导入pytorch库
import torch |
张量的生成
torch.arange(...)
:创建一个行向量
var.shape
:查看张量的形状
var.numel()
:检查张量中元素总数
var.reshape(...)
:改变一个张量的形状而不改变元素数量和元素值
torch.zeros(...)
:生成一个张量并以0
覆盖,张量形状由参数指定
torch.ones(...)
:生成一个张量并以1
覆盖,张量形状由参数指定
torch.randn(...)
:生成一个张量,元素值随机采样自标准正态分布,张量形状由参数指定
torch.tensor(...)
:指定初始化一个张量
torch.zeros_like(...)
:创建一个和传入的张量形状相同的张量,并填入0
code
import torch |
output
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) |
张量的运算
对具有相同形状的张量可以进行数值运算(类似matlab
),语义与原生python运算一致
torch.exp(...)
:e指数运算
var.sum()
:对张量所有元素求和
code
def tensor_operation(): |
output
tensor([0.5000, 8.0000, 6.0000, 0.3600]) |
张量的连接
tensor.cat(...)
:连接多个张量,第一个参数指定连接哪些,第二个参数dim
指定按第几维(轴)连接
code
def tensor_concat(): |
output
tensor([[ 0., 1., 2., 3.], |
注意到按行(轴-0)连接的张量列数不变,行合并;按列(轴-1)连接的张量行数不变,列合并
广播机制
如果我们尝试对形状不同的张量进行运算,会发生什么?答案是会将两个张量分别进行适当的复制,变得形状相同,然后运算(和matlab
机制一样)
在大多数情况下,我们将沿着数组中长度为1的轴进行广播
demo
a = tensor([[0], |
code
def tensor_broadcast(): |
output
tensor([[0], |
索引和切片
与原生python完全一致!第一个元素的索引是0,最后一个元素索引是‐1;可以指定范围以包含第一个元素和最后一个之前的元素;访问张量指定位置元素可以用matlab式访问arr[i, j]
或C式访问arr[i][j]
i:j
: [i, j)左闭右开
[:, i]
:取行所有元素(轴-0)与第i列,即第i列的所有元素
[i, :]
:取列(轴-1)与第i行,即第i行所有元素
code
def index_slice(): |
output
initial: |
节省内存
例如,如果我们用Y = X + Y,我们将取消引用Y指向的张量,而是指向新分配的内存处的张量。
code
def tensor_memory(): |
output
False |
***这是致命的!***在深度学习中我们可能有百兆级的数据,频繁地分配新内存会造成极大的浪费
幸运的是,复用内存还是比较简单的,只需要使用一下切片操作或使用op=
简化运算符来进行值覆盖,就可以继续使用旧内存, 即将y = x + y
=> y[:] = x + y
或y += x
。
code
def tensor_memory(): |
output
False |
与python对象转换
如题
code
def tensor_transform(): |
output
tensor([0, 1, 2, 3]) |
数据预处理
为了能用深度学习解决现实问题,第一步就是要对原始数据进行预处理而不是始于已经准备好的张量格式数据,此处介绍如何使用pandas库
预处理原始数据,并将原始数据转化为张量格式。pandas
可以与张量兼容。
导入pandas
库
import pandas as pd |
读取数据
pandas.read_csv(...)
:读取.csv格式的数据
pandas.read_excel(...)
:读取.xls或.xlsx格式的数据
code
def create_data_read(): |
output
NumRooms Alley Price |
缺失值处理
两种方法:插值法
和删除法
,此处介绍插值法
插值法
即用一个替代值弥补缺失值
- 连续值:对于一列/行的缺失值,可以用该行/列的均值来替代
code
def insert_missing(data): |
output
NumRooms Alley Price |
- 离散值:对于一行/列的缺失值,可以将NaN也视作一个类别(离散值)。在此例中,“巷子类型”只有
Pave
与NaN
两种类型,因此pandas可以自动将Alley列转化为Alley_Pave
和Alley_nan
两列,Alley列为Pave
的Alley_Pave=1
,Alley_nan=0
, 为NaN
的反之。使用pandas中的get_dummies方法
pandas.get_dummies(...)
:将传入数据的分类变量转化为虚拟变量(one-hot编码
),dummy_na
参数决定是否为缺失值额外创建一个虚拟列,True
为创建。
coed
def insert_missing(data): |
output
NumRooms Alley Price |
删除法
直接忽略缺失值
转换为张量格式
经过读取数据
和缺失值处理
后得到的所有条目都是数值类型的,它们可以被转化为张量格式,以方便调用pytorch
中的张量函数便捷地处理数据。
pandas.read_csv()
得到的数据是DataFrame
格式的,先调用其to_numpy
方法转化为numpy数组,再利用torch.tensor()
方法将numpy数组转化为张量格式。
DataFrame.to_numpy(dtype=...)
:将DataFrame数据转化为numpy数组,dtype
指定numpy数组的元素类型
code
def transfer_tensor(data): |
output
tensor([[3., 1., 0.], |
(•‿•)