深度学习第一周周报

摘要

本周开始学习李沐深度学习的第一周,主要是安装环境、学习深度预备知识(线性代数、学习使用相应的pytorch实现一些基本的矩阵、数据预处理操作、切片相关知识),同时对线性代数的认知有比以往考研复习有着更深入的认识,向量的本质、线性代数的本质、矩阵的本质、特征值的几何意义。

This week begins the first week of learning Li Mu’s deep learning. It mainly involves installing the environment, learning deep preparatory knowledge (linear algebra, learning to use the corresponding pytorch to implement some basic matrices, data preprocessing operations, and slicing related knowledge), and at the same time learning about linear algebra. The cognition of algebra has a deeper understanding than the previous postgraduate entrance examination review, including the nature of vectors, the nature of linear algebra, the nature of matrices, and the geometric meaning of eigenvalues.

AI 地图

在这里插入图片描述
x轴是机器学习发展技术的先后顺序,y轴是问题领域的层次顺序,最底层是感知,最开始看到一个图像,后面是基于这个图像产生推理,根据我们所看到的现象、图像形成我们的知识,最后是产生规划。深度学习是机器学习的一种,它也能做计算机视觉,也能做自然语言处理。

深度学习应用

图片分类

在这里插入图片描述
如图左所示,在过去几年,深度学习将图片分类的错误率下降到了5%以内的错误率。

物体检测和分割

在这里插入图片描述
深度学习可以从图片中检测出各个物品在图片的什么位置,而物体分割是可以精确判断到某个像素是属于哪一个具体的物体。

样式迁移

将一张图片换成另一种风格的,相当于加了一个滤镜。

人脸合成

用深度学习技术让机器合成各种假的人脸图片。

文字生成图片

根据人类输入的文字,生成对应的图片。
在这里插入图片描述

文字生成

问一个问题,深度学习技术生成相应的答案。现在的大模型:GPT等等。

无人驾驶

广告点击案例

在这里插入图片描述
1)当用户在搜索框里开始搜索一个关键词时,然后推荐区域就会显示各种相应的商品。
2)这时候触发模型,每一件商品背后有点击率预估的计算。
3)计算每一次用户点击后,广告商会给网站多少价格,将竞价*点击率得到的值,进行排序。

环境安装

在这里插入图片描述

N维数组样例

N维数组是机器学习和神经网络的主要数据结构

1)一个类别标量     1.0 1.0 1.0
2) 一个特征向量     [ 1.0 , 2.7 , 3.4 ] [1.0,2.7,3.4] [1.0,2.7,3.4]
3) 一个样本-特征矩阵
[ 1.0 2.7 3.4 4.5 3.4 4.2 3.4 2.1 5.2 ] \begin{bmatrix} 1.0&2.7&3.4 \\ 4.5& 3.4&4.2\\ 3.4& 2.1&5.2\\ \end{bmatrix} 1.04.53.42.73.42.13.44.25.2
4)RGB图片
在这里插入图片描述
5)一个RGB图片批量(批量大小高)
在这里插入图片描述
6)一个视频批量(批量大小时间通道)
在这里插入图片描述

创建数组

需要三个特征: 1)形状
            2)元素的数据类型
            3)每个元素的值

访问元素

1)按单个元素访问 [ 1 , 2 ] [1,2] [1,2]
2)按行访问 [ 1 , : ] [1,:] [1,:]
3)按列访问 [ : , 1 ] [:,1] [:,1]
4)按连续区域访问 [ 1 : 3 , 1 : ] [1:3,1:] [1:3,1:]
5)按跳跃区域访问 [ : : 3 , : : 2 ] [::3,::2] [::3,::2] 跳着访问,从第一行开始,每三行一跳,从第一列开始,每两列一跳。

数据操作实现

张量

表示一个数值组成的数组,这个数组可能有多个维度。 具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix); 具有两个轴以上的张量没有特殊的数学名称。

1)arange 创建一个行向量 x,它们默认创建为整数
2)shape属性来访问张量(沿每个轴的长度)的形状
3)numel张量中元素的总数
4)改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数
5)torch.zeros 生成一个全0矩阵
6)torch.ones 生成一个全1矩阵
7)torch.cat((x,y),dim=0) 按行合并
8)torch.cat((x,y),dim=1) 按列合并
9)通过逻辑运算符构建二元张量
X==Y 得到的张量里面的元素是False或True(如果相等就是True不相等就是False)
10)sum()是对所有元素进行求和
11)广播机制(broadcasting mechanism)
如果两个张量是同维的,比如都是矩阵的话,就可以相加,无论这两个矩阵行数和列数不一样,都会生成最小公倍数的行列数的矩阵,然后再次进行相加。

12)元素访问:
  [-1]选择最后一个元素
  [1:3]选择第二个和第三个元素
  [1,2]通过索引选择元素
  [0:2,:]第0行到第1行的所有元素赋12
13)一些操作可能会导致为新结果分配内存

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

最后判断结果是Fasle
14)原地操作
操作的结果分配给先前分配的数组

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

这个将Y的值直接加到X上,并没有对X重复使用,所以X的内存编号没有变化。
15)torch的张量与NumPy张量的转化

A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)

转化为标量

数据预处理

创建一个人工数据集,并存储在CSV(逗号分隔值)文件

import os

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

#os.path.join() 是拼接路径的函数,将上级目录和data拼接在一起,再用makedirs函数进行创建此目录,exist_ok=True说明如果此目录存在,则再次创建并且让不报error出来。

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')

然后用pandas读取read_csv函数

import pandas as pd

data = pd.read_csv(data_file)
data

结果为在这里插入图片描述

处理缺失值

“NaN”项代表缺失值。 为了处理缺失的数据,典型的方法包括插值法和删除法,其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。 我们主要考虑插值法)。
因此通过iloc函数,先将data数据分为inputs和outputs,其中前者为data的前两列,而后者为data的最后一列。 对于inputs中缺少的数值,我们用同一列的均值替换“NaN”项。
见代码:

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())  #fillna赋值给所有NAN的值
print(inputs)

对于inputs中的类别值或离散值,我们将“NaN”视为一个类别。
利用pandas.get_dummies函数,将Alley自动转化为两列,将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

然后再将他们转化为张量格式,就实现了将一个csv文件读取进来,并变成能使用的tensor格式。

线性代数

标量

标量由只有一个元素的张量表示

import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

向量

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

x = torch.arange(4)
x[3] #通过索引来访问任一元素
len(x) #通过python内置len()来访问张量的长度
x.shape #对于一个轴的张量,形状只有一个元素

矩阵

通过指定两个分量 m m m n n n来创建一个形状为的矩阵 m ∗ n m*n mn

A = torch.arange(20).reshape(5, 4)  #创建一个5行4列的矩阵
A.T #将A矩阵进行转置
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]]) #创建一个B矩阵
B == B.T  #将B矩阵与B转置矩阵进行比较

运行结果为:
在这里插入图片描述

张量

张量是描述具有任意数量轴的n维数组的通用方法。给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。

张量算法的基本性质

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
A, A + B
A * B

具体而言,[两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号 ⊙ \odot ]。
对于矩阵 B ∈ R m × n \mathbf{B} \in \mathbb{R}^{m \times n} BRm×n,其中第 i i i行和第 j j j列的元素是 b i j b_{ij} bij
矩阵 A \mathbf{A} A B \mathbf{B} B的Hadamard积为:
A ⊙ B = [ a 11 b 11 a 12 b 12 … a 1 n b 1 n a 21 b 21 a 22 b 22 … a 2 n b 2 n ⋮ ⋮ ⋱ ⋮ a m 1 b m 1 a m 2 b m 2 … a m n b m n ] . \mathbf{A} \odot \mathbf{B} = \begin{bmatrix} a_{11} b_{11} & a_{12} b_{12} & \dots & a_{1n} b_{1n} \\ a_{21} b_{21} & a_{22} b_{22} & \dots & a_{2n} b_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} b_{m1} & a_{m2} b_{m2} & \dots & a_{mn} b_{mn} \end{bmatrix}. AB= a11b11a21b21am1bm1a12b12a22b22am2bm2a1nb1na2nb2namnbmn .
将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

降维

计算元素的和

x = torch.arange(4, dtype=torch.float32)
x, x.sum()

指定张量的轴进行求和

默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。 以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。

A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape
A.sum(axis=[0, 1])  # 沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和;结果和A.sum()相同

指定张量的维度进行求均值

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

非降维

非降维求和

sum_A = A.sum(axis=1, keepdims=True)
A / sum_A #通过广播机制,来求出每一行各元素除以平均值的结果。

运行结果:
在这里插入图片描述

某个轴计算A元素的累积总和

A.cumsum(axis=0)

在这里插入图片描述

点积

给定两个向量 x , y ∈ R d \mathbf{x},\mathbf{y}\in\mathbb{R}^d x,yRd,它们的点积(dot product) x ⊤ y \mathbf{x}^\top\mathbf{y} xy
(或 ⟨ x , y ⟩ \langle\mathbf{x},\mathbf{y}\rangle x,y)是相同位置的按元素乘积的和: x ⊤ y = ∑ i = 1 d x i y i \mathbf{x}^\top \mathbf{y} = \sum_{i=1}^{d} x_i y_i xy=i=1dxiyi

import torch 
x = torch.arange(4, dtype=torch.float32)
y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)

矩阵向量积

在代码中使用张量表示矩阵-向量积,使用mv函数。 矩阵A和向量x调用torch.mv(A, x)时,会执行矩阵-向量积。 注意,A的列维数(沿轴1的长度)必须与x的维数(其长度)相同。

矩阵*矩阵乘法

将矩阵-矩阵乘法 A B \mathbf{AB} AB看作简单地执行 m m m次矩阵-向量积,并将结果拼接在一起,形成一个 n × m n \times m n×m矩阵

import torch 
A = torch.arange(20).reshape(5, 4) 
B = torch.ones(4, 3)
torch.mm(A, B)

范数

范数的性质 :
1)如果我们按常数因子缩放向量的所有元素, 其范数也会按相同常数因子的绝对值缩放: f ( α x ) = ∣ α ∣ f ( x ) . f(\alpha \mathbf{x}) = |\alpha| f(\mathbf{x}). f(αx)=αf(x).
2)三角不等式:

f ( x + y ) ≤ f ( x ) + f ( y ) . f(\mathbf{x} + \mathbf{y}) \leq f(\mathbf{x}) + f(\mathbf{y}). f(x+y)f(x)+f(y).
3)范数必须是非负的

L 1 L_1 L1范数,它表示为向量元素的绝对值之和:
∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ . \|\mathbf{x}\|_1 = \sum_{i=1}^n \left|x_i \right|. x1=i=1nxi.

L 2 L_2 L2范数是向量元素平方和的平方根
∥ x ∥ 2 = ∑ i = 1 n x i 2 , \|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2}, x2=i=1nxi2 ,

而L1、L2范数都是Lp范数特例: ∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 / p . \|\mathbf{x}\|_p = \left(\sum_{i=1}^n \left|x_i \right|^p \right)^{1/p}. xp=(i=1nxip)1/p.

矩阵范数: ∥ X ∥ F = ∑ i = 1 m ∑ j = 1 n x i j 2 . \|\mathbf{X}\|_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n x_{ij}^2}. XF=i=1mj=1nxij2 .
是矩阵元素平方和的平方根

u = torch.tensor([3.0, -4.0])
torch.norm(u) #L2范数
torch.abs(u).sum() #L1范数
torch.norm(torch.ones((4, 9))) #矩阵范数

范数的在深度学习中的作用是决优化问题: 最大化分配给观测数据的概率; 最小化预测和真实观测之间的距离。 用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。 目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。

总结

本周事情较杂,深度学习经度缓慢,下周加快对深度学习网课的学习,同时对本周重点课程也要抽时间下来复习,经过一周的课上学习,感觉到研究生期间课堂学习的局限性,也和自身的基础有极大关系;下周开始务实基础,精力全放在主要课程、深度学习、6级的备考当中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值