【深度学习笔记】数据操作+数据预处理

文章介绍了PyTorch中的张量操作,包括创建、形状变换、算术运算以及广播机制。还涉及到了张量与Numpy数组之间的转换。此外,文章演示了如何处理CSV数据,包括读取、处理缺失值和类别变量,最后将数据转换为适合PyTorch的张量格式。
摘要由CSDN通过智能技术生成

数据操作

导入pytorch

import torch

张量表示一个数值组成的数组,这个数组可能有多个维度

x = torch.arange(12)
x

out: tensor([0,1,2,3,4,5,6,7,8,9,10,11])
可以通过张量的shape属性来访问张量的形状和张量中元素总数

x.shape

out: torch.Size([12])

number elements

x.numel

out: 12
仅改变一个张量的形状而不改变元素数量和元素值,可以用reshape函数

x = x.reshape(3,4)
x

out: tensor([[1,2,3,4],
       [5,6,7,8],
       [8,9,10,11]])

torch.zeros((2,3,4))

out: tensor([[[0.,0.,0.,0.],
       [0.,0.,0.,0.],
       [0.,0.,0.,0.]],

       [[0.,0.,0.,0.],
       [0.,0.,0.,0.],
       [0.,0.,0.,0.]]])

torch.ones((2,3,4))

与上面形状一样,只是元素全是1
通过提供特定的数,打印相应维度的数组

torch.tensor([[2,1,,3],[1,2,3,4],[4,3,2,1]])

常见的标准算术运算符(+、-、* 、/ 和 **)都可以被升级为按元素运算

x = torch.tensor([1.0,2,4,8])
y = torch.tensor([2,2,2,2])
x + y, x - y, x * y, x / y, x**y # **运算符是求幂运算

在这里插入图片描述
dim = 0 表示第一个维度:行,改变行的维度
dim = 1 表示第二个维度:列,表示在y方向进行拼接

X = torch.arange(12, dtype = torch.float32).reshape((3,4))
Y = torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]])
torch.cat((X,Y),dim=0),torch.cat((X,Y),dim=1)

在这里插入图片描述
第一个tensor是按行将这两个向量拼起来,

通过逻辑运算符 构建二元张量

X == Y

在这里插入图片描述
说明只有True那里的2个元素是相等的,其他元素都不相等

对张量中的所有元素进行求和会产生只有1个元素的张量

X.sum()

在这里插入图片描述

即使形状不同,也可以通过调用 广播机制 来执行按元素操作

 a = torch.arange(3).reshape((3,1))
 b = torch.arange(2).reshape((1,2))
 a, b

在这里插入图片描述

a + b

在这里插入图片描述
因为维度一样,都是2维,它会把a按列复制成3x2矩阵,把b按行复制成2x3矩阵,然后再相加

元素的访问 / 读取
可以用[-1]选择最后一个元素,用[1:3]选择第二和第三个元素,注意[ ]是左闭右开

X[-1],X[1:3]

在这里插入图片描述
元素的写入

X[1, 2] = 9
X

在这里插入图片描述
给多个元素赋相同的值:通过冒号选中所有列

X[0:2, : ] = 12
X

在这里插入图片描述
运行一些操作可能会导致为新结果分配内存:id()
像c++中的指针
,可以告诉我们某个object在python里的唯一一个标识号

before = id(Y)
Y = Y + X #此时之前Y的内存已经被析构掉了
id(Y) == before

在这里插入图片描述
执行原地操作:torch.zeros_like() 创建一个Z,它和Y的数据以及类型都是一样的,但是内存位置不一样
Z[ : ]选中Z中所有的元素,对Z中元素进行改写

Z = torch.zeros_like(Y)
print('id(Z):',id(Z))
Z[:] = X + Y
print('id(Z):',id(Z))

在这里插入图片描述

before = id(X)
X += Y
id(X) == before

在这里插入图片描述
X = X + Y是新内存
X += Y是原地操作

这点好像跟C/C++不太一样?我感觉是不太一样

A = X.numpy() #构建一个Numpy数组
B = torch.tensor(A)
type(A),type(B)

在这里插入图片描述
将大小为1的张量转换为Python标量

a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

在这里插入图片描述

数据预处理

创建一个人工数据集,并存储在csv(逗号分隔值)文件里,csv:每一行是一个数据,每一个域是逗号分开的

import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data','house_tiny.csv')
with open(data_file, 'w') as f:
  f.write('NumRooms,Alley,Price\n') #列名
  f.write('NA,Pave,127500\n') #每行表示一个数据样本
  f.write('2,NA,106000\n')
  f.write('4,NA,178100\n')
  f.write('NA,NA,140000\n')

其中:

os.makedirs(os.path.join('..', 'data'), exist_ok=True)

在当前目录的上一级目录(‘…’)里创建data这个目录

data_file = os.path.join('..', 'data','house_tiny.csv')

然后在data目录下创建一个house_tiny.csv文件夹

从创建的csv文件中加载原始数据集:使用pandas库pd.read_cv()函数

!pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)

在这里插入图片描述
为了处理缺失的数据,典型方法包括 插值删除(删除一整行),以插值为例

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]#把data的第0列和第1列作为输入,第2列作为输出
inputs = inputs.fillna(inputs.mean())#将input的输入均值填到输入里,由于第1列不是数值,所以均值是第0列的均值
print(inputs)

对于inputs中的类别值或者离散值,可以将NaN视为一个类别
dummy_na:增加一列表示空缺值

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

在这里插入图片描述
现在inputsoutputs中所有条目都是数值类型,因此可以转换为张量格式

X, y = torch.tensor(inputs.values),torch.tensor(outputs.values)
X, y

在这里插入图片描述
inputs.value就是只有数值的输出,没有了列名

以上讲了如何将csv文件转成pytorch能用的tensor

QA:这里确实有点奇怪,a,b的id实际上是不一样的,但是改变b也能改变a的值

a = torch.arange(12)
b = a.reshape((3,4))
b[:] = 2
print(a)
print('id(a):',id(a))
print('id(b):',id(b))

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值