机器学习
机器学习常见算法分类
机器学习方式:有监督学习,无监督学习,半监督学习,强化学习。




机器学习建模流程
机器学习建模流程:获取数据、数据基本理、特征工程、机器学习(训练模型)、模型评估


模型拟合问题
拟合:用在机器学习领域,用来表示模型对样本点的拟合情况
欠拟合:模型在训练集上表现很差、在测试集表现也很差
过拟合:模型在训练集上表现很好、在测试集表现很差
泛化: 具体的、个别的扩大为一般的能力
深度学习
深度学习区别于机器学习的显著特征是学习过程不可观测

深度学习入门顺序:PyTorch中的Tensor张量 => ANN人工神经网络 => CNN卷积神经网络 =>RNN循环神经网络

Tensor张量
PyCharm快捷键:
1、alt+shift+鼠标左键:纵向复制
2、鼠标选中报错地方alt+enter自动导包
3、alt+1:左侧隐藏 alt+4:右侧隐藏
4、ctrl+alt+insert:新建python文件
5、alt+shift+↓:内容下移一行
6、shift+f6:重命名
张量的创建
张量创建基本方式
torch.tensor 根据指定数据创建张量

创建全1、全0、内容全一样的张量


创建线性和随机张量


python
torch.arange(起始值,终止值,步长) #【包左不包右】
torch.linspace(起始值,终止值,元素个数) #【等差数列】
torch.manual_seed() #【设置随机种子】
torch.rand(size=(2,3)) #【设置指定形状的均匀分布随机张量】
torch.randn(size=(2,3))# 【设置指定形状的正态分布随机张量】;
torch.randint(最小值,最大值,size=(2,3))
date = torch.tensor([1,4,,5,6,8], dtype=torch.float)
t2 = date.type(torch.int16)
张量元素类型转换


张量的类型转换
1、使用 from_numpy 可以将 ndarray 数组转换为 Tensor,默认共享内存,使用 copy 函数避免共享。
2、使用 torch.tensor 可以将 ndarray 数组转换为 Tensor,默认不共享内存。



python
# 张量 => numpy
t1 = torch.tensor([1,2,3,4,5]) n1 = t1.numpy()


张量数值计算
张量基本运算


张量点乘、乘法运算



张量运算函数
PyTorch 为每个张量封装很多实用的计算函数:
均值
平方根
求和
指数计算
对数计算等等



张量索引操作

简单行列索引

列表索引

范围索引

布尔索引
依据文字的前后顺序,看函数时从里到外看

多维索引


张量形状操作
1、reshape 函数可以在保证张量数据不变的前提下改变数据的维度,将其转换成指定的形状。
2、squeeze 函数删除形状为 1 的维度(降维),unsqueeze 函数添加形状为1的维度(升维)。
3、transpose 函数可以实现交换张量形状的指定维度, 例如: 一个张量的形状为 (2, 3, 4) 可以通过 transpose 函数把 3 和 4 进行交换, 将张量的形状变为 (2, 4, 3) 。 permute 函数可以一次交换更多的维度。
4、view 函数也可以用于修改张量的形状,只能用于修改连续的张量。在 PyTorch 中,有些张量的底层数据在内存中的存储顺序与其在张量中的逻辑顺序不一致,view 函数无法对这样的张量进行变形处理,例如: 一个张量经过了 transpose 或者 permute 函数的处理之后,就无法使用 view 函数进行形状操作。
python
# 获取张量维度大小
张量.shape[0] #【第0维大小】
张量.shape[1] #【第1维大小】
# 1、使用 reshape 函数修改张量形状
data = torch.tensor([[10, 20, 30], [40, 50, 60]])
new_data = data.reshape(1, 6)
print(new_data.shape) #torch.Size([1, 6])
#2、使用squeeze 函数(降维)与unsqueeze 函数(升维)
mydata1 = torch.tensor([1, 2, 3, 4, 5])
mydata2 = mydata1.unsqueeze(dim=0)
print('在0维度上 拓展维度:', mydata2, mydata2.shape) #1*5
mydata3 = mydata1.unsqueeze(dim=1)
print('在1维度上 拓展维度:', mydata3, mydata3.shape) #5*1
mydata4 = mydata1.unsqueeze(dim=-1)
print('在-1维度上 拓展维度:', mydata4, mydata4.shape) #5*1
mydata5 = mydata4.squeeze()
print('压缩维度:', mydata5, mydata5.shape) #1*5
# 3、使用transpose 函数与permute 函数
data = torch.tensor(np.random.randint(0, 10, [3, 4, 5]))
print('data shape:', data.size())
# 3.1 交换1和2维度
mydata2 = torch.transpose(data, 1, 2)
print('mydata2.shape--->', mydata2.shape)
# 3.2 将data 的形状修改为 (4, 5, 3), 需要变换多次
mydata3 = torch.transpose(data, 0, 1)
mydata4 = torch.transpose(mydata3, 1, 2)
print('mydata4.shape--->', mydata4.shape)
# 3.3 使用 permute 函数将形状修改为 (4, 5, 3)
# 3.3.1 方法1
mydata5 = torch.permute(data, [1, 2, 0])
print('mydata5.shape--->', mydata5.shape)
# 3.3.2 方法2
mydata6 = data.permute([1, 2, 0])
print('mydata6.shape--->', mydata6.shape)
#4、使用is_contiguous()判断是否为连续张量,使用 contiguous 函数转换为连续的张量,再使用 view 函数
# 使用 transpose 函数修改形状
data = torch.tensor( [[10, 20, 30],[40, 50, 60]])
mydata3 = torch.transpose(data, 0, 1)
mydata4 = mydata3.contiguous().view(2, 3)
张量拼接操作
1、torch.cat()函数可以将多个张量根据指定的维度拼接起来,不改变维度数。
2、torch.stack()函数会在一个新的维度上连接一系列张量,这会增加一个新维度,并且所有输入张量的形状必须完全相同。
注意:行列宽,从外层到内层;想象三维张量时建立空间感【行--左右;列--上下;宽--里外】


自动微分模块

1、PyTorch不支持向量张量对向量张量的求导,只支持标量张量对向量张量的求导
x如果是张量,y必须是标量(一个值)才可以进行求导
2、计算梯度: y.backward(), y是一个标量
3、获取x点的梯度值: x.grad, 会累加上一次的梯度值
4、梯度下降法公式: w = w - r*grad (r是学习率, grad是梯度值)
5、清空上一次的梯度值: x.grad.zero_()
6、梯度计算不能将自动微分的张量转换成numpy数组,会发生报错,可以通过detach()方法实现
案例-演示自动微分真实应用场景




