dive into deep-learning

2、预备知识

2.1数据操作----深度学习存储和操作数据的主要接口是张量(n维数组)

1.torch

张量:tensor

创建tensor的方法:torch.arange(12),创建[0,12)的向量;

查看tensor的大小:x.shape或者x.numel()

重构tensor的维度:x.reshape(3,4)

创建特殊的tensor:torch.zeros(3,3,4),torch.ones(3,3,4),

torch.randn(3,3,4),其中随机数是从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。

直接定义tensor:torch.tensor([1,2,3])

2.运算符

按元素计算:有两个tensor,x+y就是tensor的对应元素相加,x**y就是x为底数,y的对应位置元素做幂运算

tensor的拼接:torch.cat((x,y),dim=0)按行拼接;torch.cat((x,y),dim=1)按列拼接

tensor的逻辑运算:X==Y,如果X和Y的对应位置元素相等,该位置输出True,否则输出False,注意X和Y的形状需要一致

tensor的求和:x.sum();返回一个单元素的张量(不管原来的tensor是几维)

3.广播机制(在两个tensor的形状不一致时,进行运算)

做法:通过适当复制元素(行或者列)来扩展一到两个tensor使要进行运算的tensor具有相同的维度,再对应元素进行运算

X=torch.tensor([[1,2,3,4,4],[1,4,5,6,7]])

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

X+Y=tensor([[ 2,  4,  6,  8, 10],[ 2,  6,  8, 10, 13]])

4.索引和切片

第一个元素:X[0]

最后一个元素:X[-1]

选择元素:X[1:3];第2和3个元素,左闭右开[1:3)

对指定元素改写:X[1,2]=9

对切片多个元素赋值:X[0:2,:]=12,对前两行的元素全部赋值为为12

5.节省内存

使用原地操作:X+=Y,而不是X=X+Y

6.转换为其他Python对象

把pytorch的张量tensor转化为Numpy的张量ndarray

A=X.numpy()

B=torch.tensor(A)

把维度为1的tensor转化为标量:

X=torch.tensor([2]);

X.item();  或者 int(X);  float(X);

只针对于形状大小为1的tensor
 

2.2数据预处理

主要使用pandas包,因为原始数据不一定是tensor的形式,所以需要对原始数据进行预处理

1.读取数据集

先构造一个csv格式的数据集:

import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)//创建多层目录

//os.makedirs(name, mode=0o777, exist_ok=False),其中name是目录名,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')

data=pd.read_csv(data_file)//读取数据:

2.处理缺失值

“NaN”项代表缺失值,处理缺失的数据,典型的方法包括插值法和删除法

通过位置索引iloc,我们将data分成inputs和outputs

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]

inputs = inputs.fillna(inputs.mean())//fillna就是fill NA的数据,填充无效缺失的数据

print(inputs)

对于inputs中的类别值或离散值,我们将“NaN”视为一个类别,然后把原有的数据分为两类,有值的数据分为一类,缺失值的分为一类

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

get_dummies是 pandas 实现one hot encode(独热编码)的方式,将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。

3.把输入输出转换成tensor形式,方便运算

x=torch.tensor(inputs.values)

y=torch.tensor(outputs.values)

*****************************************************

![Alt text](1697356197.png)//数据预处理结构图

*****************************************************

2.3线性代数

1.标量

仅包含一个数值被称为标量(scalar)

x=torch.tensor([1]);标量由只有一个元素的张量表示

2.向量

向量可以被视为由标量组成的列表

x=torch.tensor([1,2,3,4]);通过一维张量表示向量

向量的长度:len(x);用函数获取

向量的长度:x.shape;用属性获取

3.矩阵

矩阵可以看作多个向量的组合

构造矩阵:A=torch.arange(12).reshape(3,4)

矩阵的转置:A.T

4.张量tensor

就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构

扩大维数:例如表示颜色通道的RGB:红色、绿色和蓝色

X=torch.arange(20).reshape(2,2,5)

B=X.clone()把X的副本分配给B

5.tensor的性质

矩阵乘法:A*B;加法:A+B

6.降维

对任意张量进行的一个有用的操作是计算其元素的和

X.sum()

也可以指定tensor沿哪一个轴来通过求和降低维度

按行降维(求和):A.sum(axis=0)

按列降维(求和):A.sum(axis=1)

也可以使用平均值来降维:

A.mean(), 或者A.sum() / A.numel()

也可以指定tensor沿哪一个轴来通过求和降低维度

A.mean(0), 或者A.sum(0) / A.numel(0)

7.非降维求和

sum_A=A.sum(axis=0,keepdim=True),相当于二阶矩阵保留了维度,变成对角矩阵了,以后可以通过广播求:A / sum_A

按照某个轴来求和,不会降维:A.cumsum(axis=0)

8.点积

相同位置的按元素乘积的和

torch.dot(x,y)

9.矩阵-向量积

torch.mv(A,x)

A是矩阵,x是向量

10.矩阵和矩阵乘法

torch.mm(X,Y)

11.范数---一般用来表示优化问题中的距离问题

||x||=||x||_{2},通常来说,向量的范数就是说向量的L2范数

向量L2范数:troch.norm(x)

向量L1范数:torch.abs(x).sum()

矩阵F 范数:torch.norm(A)


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值