深度学习笔记001DataProcess数据操作/数据预处理
很荣幸中国能有李沐老师这样无私的人出中文版的深度学习教程,而且跟学起来非常棒!
首先整理一下简单的数据操作语法(基于python-Torch库)
# 01 一些基本的数据操作 import torch x = torch.arange(12) print(x) print(x.shape) print(x.numel()) # num of elements x = x.reshape(3, 4) print(x) zero = torch.zeros(2, 3, 4) ones = torch.ones(2, 3, 4, 5, 6) print(zero) print(ones) print(torch.tensor([[1234, 5678], [9101112, 13141516]])) import torch x = torch.tensor([1.0, 2, 4, 8, 16]) y = torch.tensor([2, 2, 2, 2, 2]) print(x + y, x - y, x * y, x / y, x ** y) # "**"为幂运算 zhishu = torch.exp(x) # 以e为低的指数函数 print(zhishu) # 张量的连接 x = torch.arange(12, dtype=torch.float32).reshape((3, 4)) y = torch.tensor([[11, 22, 33, 44], [55, 66, 77, 88], [99, 00, 111, 222]]) print("x=", x) print("y=", y) z = torch.cat((x, y), dim=0) # 直接连接,dim表示维度 print(z) z = torch.cat((x, y), dim=1) print(z) # 两个张量之间的逻辑运算 print(x == y) print(x.sum()) # 形状不同的张量,通过广播机制(broadcasting mechanism)来执行按元素操作 a = torch.arange(3).reshape((3, 1)) b = torch.arange(2).reshape((1, 2)) print(a, "\n", b) print(a + b) # 这个广播机制出错率极高,因为按理说不同形状的张量不应该加在一起(一般情况下),但是你以为两个相同形状的张量相加之后的结果却和真实结果不同,那么这俩张量的形状可能一开始就不相同,要留意这个广播机制 # 访问 x = torch.arange(12, dtype=torch.float32).reshape((3, 4)) print(x) print(x[-1]) print(x[1:3]) x[1, 2] = 999 print(x) x[1:3, 2:4] = 0 print(x) x[2:3, :] = 777 print(x) # 比较大的矩阵可能导致新结果分配内存 before = id(y) y = y + x print(id(y) == before) # false # 但是如果后序不重复使用y,那么也可以不重新分配内存(通过y[:]=y+x或者y+=x来减少内存开销) before = id(y) y[:] = y + x print(id(y) == before) # true before = id(y) y += x print(id(y) == before) # true # 碎碎念:就这我就很讨厌python,特么的y=x+y和y+=x竟然不是一个意思 # 执行原地操作(不更改内存) z = torch.zeros_like(x) print('id(z):', id(z)) print(z) z[:] = x + y print(z) print('id(z):', id(z)) print(x) print(y) # numpy和Torch之间的转换 import numpy a = x.numpy() b = torch.tensor(a) print(type(a), type(b)) # 将大小为1的张量转换为python的标量 t = torch.tensor([9.98]) print(t) print(t.item()) print(type(t.item())) print(float(t)) print(int(t))
其次是一些数据预处理的语法:
1 # 02 数据处理 2 import os 3 4 os.makedirs(os.path.join('..', 'data'), exist_ok=True) 5 data_file = os.path.join('..', 'data', 'AOANumbers.csv') 6 with open(data_file, 'w') as f: 7 print('我要存csv了') 8 f.write("TestIsMean,Name,Occupation,LoveLevel(0-10) \n") 9 f.write('4,金雪炫,领舞,10\n') 10 f.write('7,NA,4,9\n') 11 f.write('NA,朴草娥,主唱,10\n') 12 f.write('7,申智珉,Rapper,8\n') 13 f.write('4,权玟娥,NA,9\n') 14 f.write('NA,NA,主唱,10\n') 15 f.write('NA,NA,NA,8\n') 16 17 import pandas as pd 18 19 data = pd.read_csv(data_file, encoding='GB2312') # 因为存了中文,所以编码方式需要改成GB2312(默认utf-8) 20 print(data) 21 22 inputs, outputs = data.iloc[:, 0:3], data.iloc[:, 3] 23 inputs = inputs.fillna(inputs.mean()) 24 print(inputs) 25 26 # 将inputs的类别值或者离散值,将NaN视为一个类别,同时把他们特征化 27 inputs = pd.get_dummies(inputs, dummy_na=True) # dummy_na代表将NaN视为一个类别 28 print(inputs) 29 # pd.set_option('display.width',1000) 30 # pd.set_option('display.max_colwidth',1000) 31 pd.set_option('display.max_columns', None) 32 print(inputs) 33 34 x, y = torch.tensor(inputs.values), torch.tensor(outputs.values) 35 print(x, '\n', y,) 36 37 # 李沐老师答疑——深拷贝与浅拷贝 38 a = torch.arange(12) 39 b=a.reshape((3,4)) 40 print(b) 41 print(a) 42 b[:]=22 #此时b是a的一个浅拷贝,改值的时候是从a上改的 43 print(a) 44 45 # tensor是数学概念,是一个张量,Array是计算机概念,是一个数组 46 # 新分配了y的内存,之前y占用的内存就会被自动释放