paddle学习笔记
Published in:2024-03-08 | category: 深度学习
Words: 1.6k | Reading time: 5min | reading:

1

特征选取,避免被不相关的特征干扰:

可以明显的看到,不同的特征,结果还是差别很大的,如果我只用选取上图准确率最高的一类特征来训练模型,80.32%测试结果将比使用全部特征作为训练数据71%好不少,这个DWT-Approx(4-14Hz) db2,k=1 特征就相当于我们第一个例子中找正方体的‘形状’特征,即主要特征。那么针对未来的训练,我们可以尝试提取表现最好的几个特征就好了;为什么选最好的几个特征,只选最好的那一个不是更高吗

1
2
3
4
5
6
7
8
9
10
11
在特征选择时,选择几个表现最好的特征通常比只选一个最好的特征更可靠和有效。以下是一些原因:

1. **信息丰富性**:使用多个好的特征可以提供更多关于数据集的信息,有助于更好地描述数据之间的关系。这可以提高模型的泛化能力。

2. **冗余性**:有时候一个单一最好的特征可能会包含某些冗余信息,而使用多个表现良好且互补的特征可以帮助消除冗余性,提高模型的鲁棒性。

3. **模型稳定性**:过于依赖一个最好的特征可能使得模型对于噪声和异常数据更为敏感。多个好的特征可以增加模型的稳定性,降低对噪声的敏感度。

4. **综合考量**:不同的特征可能会捕捉到数据不同方面的信息,综合利用多个表现良好的特征有利于更全面地学习数据的规律,提高模型的性能。

因此,一般情况下,选择数个表现良好且互补的特征比单个最好的特征更为合适。当然,具体选择多少个特征取决于实际应用场景和数据集的特点。

2

3

4

现在知道乘客每次乘坐出租车的公里数,也知道乘客每次下车的时候支付给出租车司机的总费用。但是并不知道乘车的起步价,以及每公里行驶费用是多少。希望让机器从这些数据当中学习出来计算总费用的规则。

更具体的,想要让机器学习程序通过数据学习出来下面的公式当中的参数 w 和参数 b(这是一个非常简单的示例,所以w和b都是浮点数,随着对深度学习了解的深入,你将会知道w和b通常情况下会是矩阵和向量)。这样,当下次乘车的时候,知道了行驶里程distance_travelled的时候,就可以估算出来用户的总费用total_fee了。

1
total_fee = w * distance_travelled + b

在这个机器学习任务中,已经知道了乘客的行驶里程distance_travelled,和对应的,这些乘客的总费用total_fee。

通常情况下,在机器学习任务中,像distance_travelled这样的输入值,一般被称为x(或者特征feature),像total_fee这样的输出值,一般被称为y(或者标签label)。

可以用paddle.to_tensor把示例数据转换为paddle的Tensor数据。

tensor

飞桨使用张量(Tensor) 来表示神经网络中传递的数据,Tensor 可以理解为多维数组,类似于 Numpy 数组(ndarray) 的概念。与 Numpy 数组相比,Tensor 除了支持运行在 CPU 上,还支持运行在 GPU 及各种 AI 芯片上,以实现计算加速;此外,飞桨基于 Tensor,实现了深度学习所必须的反向传播功能和多种多样的组网算子,从而可更快捷地实现深度学习组网与训练等功能。两者具体异同点可参见下文 Tensor 与 Numpy 数组相互转换。

在飞桨框架中,神经网络的输入、输出数据,以及网络中的参数均采用 Tensor 数据结构,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def train(model):
# 首先定义了一个函数train(model),该函数的作用是进行神经网络模型的训练。在函数内部,调用了模型的train()方法,将模型设置为训练模式。
model.train()
# 设置了训练的轮数epochs为2
epochs = 2
# 初始化了优化器optim,使用了Adam优化器,学习率为0.001,并传入了模型的参数model.parameters()
# model.parameters()返回一个包含模型所有参数的迭代器或列表,
# 这些参数是需要根据训练数据进行调整的。
# 在优化器中,可以将这些参数传递给优化器,使得优化器能够根据损失函数的梯度来更新这些参数,从而不断优化模型以实现更好的性能。
optim = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters())
# 模型训练的两层循环
for epoch in range(epochs):
for batch_id, data in enumerate(train_loader()):
x_data = data[0]
y_data = data[1]
print("x_data: ", x_data[0][0][0][0]) # 打印神经网络的输入:批数据中的第一个数据的第一个元素
predicts = model(x_data)
print("predicts: ", predicts[0]) # 打印神经网络的输出:批数据中的第一个数据的第一个元素
print("weight: ", model.linear1.weight[0][0]) # 打印神经网络的权重:linear1 层的 weight 中的第一个元素
loss = F.cross_entropy(predicts, y_data)
acc = paddle.metric.accuracy(predicts, y_data)
loss.backward()
optim.step()
optim.clear_grad()
break
break
model = LeNet()
train(model)
model.train()

在训练开始之前写上 model.trian() ,在测试时写上 model.eval()。
在使用PyTorch构建神经网络进行训练时,我们通常会在训练过程中的代码中添加model.train()这一句,以确保启用Batch Normalization(BN)和Dropout层的功能。

批标准化 (Batch Normalization)
          </div>        </details>
Prev:
paddle.nn.Layer
Next:
图像处理笔记