深度学习笔记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占用的内存就会被自动释放

 

posted @ 2021-12-26 20:32  爱和九九  阅读(338)  评论(0编辑  收藏  举报