使用 PyTorch/TensorFlow 进行分类#

来自 AI for Beginners Curriculum 的实验任务。

第一部分:鸢尾花分类#

鸢尾花数据集包含 150 条记录,分为 3 种不同类别的鸢尾花。每条记录包含 4 个数值参数:萼片长度/宽度和花瓣长度/宽度。这是一个简单的数据集示例,不需要使用强大的神经网络。

获取数据集#

鸢尾花数据集内置于 Scikit Learn,因此我们可以轻松获取:

In [1]:
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 的包自动完成:

In [11]:
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

In [12]:
sns.pairplot(df,hue='Label')
<seaborn.axisgrid.PairGrid at 0x14f4f772f70>
Notebook 输出图像

规范化和编码数据#

为了准备数据用于神经网络训练,我们需要将输入规范化到 [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]
In [13]:
# Code to normalize and encode the data

将数据分为训练集和测试集#

由于我们没有单独的训练集和测试集,因此需要将数据拆分为训练集和测试集 使用 Sklearn

In [14]:
# Split the data

定义和训练神经网络#

现在你已经准备好了,导入你喜欢的框架,定义神经网络并开始训练,同时观察训练和验证准确率的变化情况。

In [ ]:
# Define the network
In [ ]:
# Train the network
In [15]:
# Visualize train/validation accuracy graph

实验#

现在你可以尝试不同的网络结构,看看它如何影响结果。试试以下几种方法:

  1. 一个包含3个神经元(等于类别数)的单层网络
  2. 一个包含小/中/大隐藏层的两层网络
  3. 使用更多层的网络

当你使用包含大量神经元(参数)的复杂模型时,一定要注意观察过拟合现象。

In [ ]:
# Experiment

第2部分:MNIST训练#

Keras和PyTorch都将MNIST作为内置数据集,因此你可以通过几行代码轻松获取它(KerasPyTorch)。你还可以直接加载训练集和测试集,而无需手动拆分它们。

In [ ]:
# Load the dataset

现在,您需要执行上述步骤,以确保数据集已标准化(它可能已经标准化),并定义和训练一个神经网络。

重点#

  1. 神经网络可以用于传统的机器学习任务。然而,在许多情况下,它们过于强大,可能会导致过拟合。
  2. 在本次作业中,观察过拟合现象并尝试避免它是非常重要的。
  3. 使用像 Keras 这样的框架,有时训练神经网络相对简单。但您需要理解其中的原理。

免责声明
本文档使用AI翻译服务Co-op Translator进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用本翻译而引起的任何误解或误读不承担责任。