使用 PyTorch/TensorFlow 进行分类#
来自 AI for Beginners Curriculum 的实验任务。
第一部分:鸢尾花分类#
鸢尾花数据集包含 150 条记录,分为 3 种不同类别的鸢尾花。每条记录包含 4 个数值参数:萼片长度/宽度和花瓣长度/宽度。这是一个简单的数据集示例,不需要使用强大的神经网络。
获取数据集#
鸢尾花数据集内置于 Scikit Learn,因此我们可以轻松获取:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
features = iris['data']
labels = iris['target']
class_names = iris['target_names']
feature_names = iris['feature_names']
print(f"Features: {feature_names}, Classes: {class_names}")Features: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'], Classes: ['setosa' 'versicolor' 'virginica']
可视化数据#
在许多情况下,可视化数据是有意义的,这样可以查看数据是否看起来是可分的——这能让我们确信可以构建一个良好的分类模型。由于我们有少量的特征,可以构建一系列成对的二维散点图,用不同的点颜色表示不同的类别。这可以通过一个名为 seaborn 的包自动完成:
import seaborn as sns
import pandas as pd
df = pd.DataFrame(features,columns=feature_names).join(pd.DataFrame(labels,columns=['Label']))
df| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | Label | |
|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | 0 |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | 0 |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | 0 |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | 0 |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | 0 |
| ... | ... | ... | ... | ... | ... |
| 145 | 6.7 | 3.0 | 5.2 | 2.3 | 2 |
| 146 | 6.3 | 2.5 | 5.0 | 1.9 | 2 |
| 147 | 6.5 | 3.0 | 5.2 | 2.0 | 2 |
| 148 | 6.2 | 3.4 | 5.4 | 2.3 | 2 |
| 149 | 5.9 | 3.0 | 5.1 | 1.8 | 2 |
150 rows × 5 columns
sns.pairplot(df,hue='Label')<seaborn.axisgrid.PairGrid at 0x14f4f772f70>规范化和编码数据#
为了准备数据用于神经网络训练,我们需要将输入规范化到 [0..1] 的范围内。这可以通过简单的 numpy 操作完成,也可以使用 Scikit Learn 方法。
此外,你需要决定是否将目标标签进行独热编码(one-hot encoding)。PyTorch 和 TensorFlow 允许你以两种方式提供类别编号:可以是整数形式(从 0 到 N-1),也可以是独热编码向量。在创建神经网络结构时,你需要根据输入格式指定相应的损失函数(例如,数字表示使用 sparse categorical crossentropy,独热编码使用 crossentropy loss)。独热编码也可以通过 Sklearn 实现,或者使用以下代码片段:
n_values = np.max(labels) + 1
labels_onehot = np.eye(n_values)[labels]
# Code to normalize and encode the data将数据分为训练集和测试集#
由于我们没有单独的训练集和测试集,因此需要将数据拆分为训练集和测试集 使用 Sklearn
# Split the data定义和训练神经网络#
现在你已经准备好了,导入你喜欢的框架,定义神经网络并开始训练,同时观察训练和验证准确率的变化情况。
# Define the network# Train the network# Visualize train/validation accuracy graph实验#
现在你可以尝试不同的网络结构,看看它如何影响结果。试试以下几种方法:
- 一个包含3个神经元(等于类别数)的单层网络
- 一个包含小/中/大隐藏层的两层网络
- 使用更多层的网络
当你使用包含大量神经元(参数)的复杂模型时,一定要注意观察过拟合现象。
# Experiment第2部分:MNIST训练#
Keras和PyTorch都将MNIST作为内置数据集,因此你可以通过几行代码轻松获取它(Keras,PyTorch)。你还可以直接加载训练集和测试集,而无需手动拆分它们。
# Load the dataset现在,您需要执行上述步骤,以确保数据集已标准化(它可能已经标准化),并定义和训练一个神经网络。
重点#
- 神经网络可以用于传统的机器学习任务。然而,在许多情况下,它们过于强大,可能会导致过拟合。
- 在本次作业中,观察过拟合现象并尝试避免它是非常重要的。
- 使用像 Keras 这样的框架,有时训练神经网络相对简单。但您需要理解其中的原理。
免责声明:
本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用本翻译而引起的任何误解或误读不承担责任。