✨简介
这是一项旨在测试不同调整参数对基线多层感知器的影响的实验。为模型分析和测试开发的代码是一组自动化脚本,用于测试模型的不同配置,同时对代码进行最少的更改。
您可以从此存储库中获取代码 。
该代码允许测试以下模型参数:
- 激活函数
- 批量大小
- 纪元
- 内核初始化器
- 学习率
- 损失函数
- 网络架构
- 优化器
用于实现 MLP 的库是 Keras,因此功能和选项仅限于该库。
✨ 文件结构
主目录包含用于数据处理的 Python 笔记本、使用的数据集以及上述所有参数的子目录。每个参数子目录都有一个 Python notebook,其中包含用于测试该参数的代码,还有另一个名为 figures 的子目录,用于存储从 Python notebook 生成的所有图表。
文件结构可视化
✨ 数据处理
这里使用的数据集已经过预处理,因此除了将数据集拆分为训练集、验证集和测试集外,不需要做太多工作。但是,在使用不同数据集的情况下,可以将处理数据集的代码片段添加到该文件中。
数据集“online_shop_data”共有 16626 个样本。其中的 20% 用作具有约 3326 个样本的测试集。剩余的数据集进一步分为训练集和验证集,每个分别包含 ~10640 和 ~2660 个样本。
✨ 激活函数
本实验测试了 9 种不同激活函数的效果。这里的激活函数只指输入层和隐藏层的激活函数,不包括输出层。使用的激活函数是:
relu、sigmoid、softmax、softplus、softsign、tanh、selu、elu、指数
所有其他参数都保持不变,以便更好地了解不同激活函数的效果:
输出层的激活函数:softmax,批量大小:32,时期:50,内核初始化器:he_uniform,学习率:0.03,损失函数:categorical_crossentropy,优化器:Adam,网络架构:512-128-96-2
下图展示了不同激活函数对 MLP 模型的影响:
跨时期激活函数的损失和准确性
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的激活函数的平均损失和准确度
分别针对损失和准确性将其可视化,我们得到以下图表。
我们可以从数据框和图表中观察到,softmax激活函数在测试集中的准确度最高,为 84.39%,紧随其后的是softsign激活函数,在测试集中的准确度为 84.18%。
✨ 批量大小
在这个实验中测试了 6 个不同的 batch_size 值作为小批量的一部分,这些值是
16、32、64、128、256 和 512。
所有其他参数都保持不变,以便更好地了解不同批量大小的影响:
激活函数:relu,输出层的激活函数:softmax,epochs:50,内核初始化器:he_uniform,学习率:0.03,损失函数:categorical_crossentropy,优化器:Adam,网络架构:512-128-96-2
以下图表展示了不同批量大小对 MLP 模型的影响:
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的批量大小的平均损失和准确度
分别针对损失和准确性将其可视化,我们得到以下图表。
从数据观察,128个样本的batch size在测试数据上的准确率最高,准确率为85.26%,batch size为512和16紧随其后,在测试数据上的准确率分别为83.61%和83.13% .
✨时代
与批量大小类似,实验中考虑了 epoch 大小的 6 种变化。
10, 20, 50, 100, 200, 500
所有其他参数都保持不变,以便更好地了解不同时期大小的影响:
激活函数:relu,输出层的激活函数:softmax,批量大小:50,内核初始化器:he_uniform,学习率:0.03,损失函数:categorical_crossentropy,优化器:Adam,网络架构:512-128-96-2
以下图表展示了不同时期大小对 MLP 模型的影响:
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的时期大小的平均损失和准确性
分别针对损失和准确性将其可视化,我们得到以下图表。
正如我们可以从数据框和图中观察到的那样,使用 10 的纪元大小对测试数据具有最高的准确度,准确率为 85.23%,其次是使用 25 的纪元大小对测试数据的准确度为 82.08%。所有其他变体的准确度都在 50% 左右。
✨ 内核初始化器
keras 库中有 13 种不同的内核初始化程序可用于配置模型。
random_normal, random_uniform, truncated_normal, zeros, ones, glorot_normal, glorot_uniform, he_normal, he_uniform, identity, 正交, 常量, variance_scaling
所有其他参数都保持不变,以便更好地了解不同内核初始化器的效果:
激活函数:relu,输出层的激活函数:softmax,批量大小:50,epochs:50,学习率:0.03,损失函数:categorical_crossentropy,优化器:Adam,网络架构:512-128-96-2
以下图表展示了不同内核初始化器对 MLP 模型的影响:
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的内核初始化器的平均损失和准确度
分别针对损失和准确性将其可视化,我们得到以下图表。
我们可以从上面的数据和图表中观察到,使用variance_scaling可以获得 85.35% 的最佳准确率。其他一些 kernel_initializers,如orthogonal、identity、he_uniform、he_normal、truncated_normal、random_uniform 和 random_normal紧随其后,精度在类似范围内。
✨学习率
本实验使用了从小步到大步的 6 种不同的学习率。
0.001, 0.003, 0.01, 0.03, 0.1, 0.3
所有其他参数都保持不变,以便更好地了解不同学习率的影响:
激活函数:relu,输出层的激活函数:softmax,批量大小:50,epochs:50,kernel_initializer:he_uniform,损失函数:categorical_crossentropy,优化器:Adam,网络架构:512-128-96-2
下图展示了不同学习率对 MLP 模型的影响:
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
训练、验证和测试集学习率的平均损失和准确度
分别针对损失和准确性将其可视化,我们得到以下图表。
从数据中可以看出,0.003 的学习率在实验中表现出最高的准确率 86.68%,紧随其后的是 0.001、0.01 和 0.03 的学习率,准确率分别为 86.68%、85.95% 和 81.62%。然而,较小学习率的权衡是所需的时间和计算。
✨ 损失函数
本实验总共测试了 7 个不同的损失函数,其中 4 个被归类为概率损失,另外 3 个被归类为铰链损失。
概率损失:binary_crossentropy、categorical_crossentropy、poisson、kl_divergence;铰链损失:铰链、squared_hinge、categorical_hinge
所有其他参数都保持不变,以便更好地了解不同损失函数的效果:
激活函数:relu,输出层的激活函数:softmax,批量大小:50,epochs:50,kernel_initializer:he_uniform,learning_rate:0.03,优化器:Adam,网络架构:512-128-96-2
以下是展示不同损失函数对 MLP 模型的影响的图表:
跨时期损失函数的损失和准确性
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的损失函数的平均损失和准确度
分别针对损失和准确性将其可视化,我们得到以下图表。
从上面的数据和图表可以看出,我们可以注意到,categorical_crossentropy 损失函数的准确度最高,为 83.73%,其次是 hinge 损失函数,准确度为 74.32%,而其余损失函数保持在 50% 左右。
✨ 网络架构
可以在 MLP 中实现的深度和宽度有无数种变化,但是,更复杂并不总是意味着更好的性能。本实验中实现了 5 种不同的网络架构。
128–2、256–2、256–128–2、128–256–128–2、512–256–128–96–2
所有其他参数都保持不变,以便更好地了解不同损失函数的效果:
激活函数:relu,输出层的激活函数:softmax,批量大小:50,epochs:50,kernel_initializer:he_uniform,learning_rate:0.03,loss_function:categorical_crossentropy,优化器:Adam
下图展示了不同网络架构对 MLP 模型的影响:
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的网络架构的平均损失和准确性
分别针对损失和准确性将其可视化,我们得到以下图表。
所有网络架构的损失和准确性指标的可视化
我们可以观察到,在所有架构中,最简单的网络架构以 85.23% 的准确率表现最好,而最深和最复杂的网络始终具有最低的准确率,约为 50%。
✨优化器
本实验测试了 keras 库中可用的 10 种不同的优化器。
SGD、RMSprop、Adam、AdamW、Adadelta、Adagrad、Adamax、Adafactor、Nadam、Ftrl
所有其他参数都保持不变,以便更好地了解不同优化器的效果:
激活函数:relu,输出层的激活函数:softmax,批量大小:50,epochs:50,kernel_initializer:he_uniform,learning_rate:0.03,loss_function:categorical_crossentropy,网络架构:512-128-96-2
以下图表展示了不同优化器对 MLP 模型的影响:
此外,我们可以观察不同数据子集的损失和准确性的平均值:训练、验证和测试。
跨训练、验证和测试集的优化器的平均损失和准确性
分别针对损失和准确性将其可视化,我们得到以下图表。
从上面的数据和图表中,我们可以看出 Adamax 优化器以 87.01% 的准确率表现最好,紧随其后的是其他一些优化器,如 Adagrad、Ftrl、Adadelta 和 Adam,准确率分别为 86.16%、85.59%、84.93 % 和 83.07% 分别在测试集上。
✨ 如何测试不同的变化?
每个 Python 笔记本都有一个代码单元,其中包含所有常量参数和可变参数的变量。然后可以更改这些以适应用例并运行一致的测试。
代码片段示例
从上面的示例代码片段可以看出,所有常量参数都由全部大写的变量名称表示,而变量参数是一个列表。可以更改列表中的项目以更新要测试的可变参数的不同变体。
每个测试都遍历可变参数列表,并使用可变参数的特定实例和所有常量参数构建模型。这样可以在对代码进行最少更改的情况下测试不同的变体,并显着减少人为错误的可能性。
✨脚注
嘿,希望你喜欢这篇博文。这最初是我测试不同变体及其效果的家庭作业,但我决定将其上交以使其自动化——当然,因为我很懒——结果证明只需对代码进行最少的更改就可以进行测试。
考虑在 Medium、Twitter 和其他平台上关注我,以阅读有关生产力、设计和代码的更多信息。