当前位置:   article > 正文

吴恩达机器学习-可选实验室:多类分类(Multi-class Classification)_吴恩达机器学习可选实验室

吴恩达机器学习可选实验室

1.1目标

在这个实验室里,你将探索一个使用神经网络进行多类分类的例子。在这里插入图片描述

1.2工具

您将使用一些打印例程。这些存储在此目录中的lab_utils_multiclass_TF.py中。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib widget
from sklearn.datasets import make_blobs
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
np.set_printoptions(precision=2)
from lab_utils_multiclass_TF import *
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.0多类分类

神经网络通常用于对数据进行分类。例如神经网络:

  • 拍摄照片并将照片中的主题分类为{狗、猫、马、其他}
  • 取一个句子,对其成分的词性进行分类:{名词、动词、形容词等。}

这种类型的网络在其最后一层将具有多个单元。每个输出都与一个类别相关联。当输入示例应用于网络时,具有最高值的输出是预测的类别。如果将输出应用于softmax函数,则softmax的输出将提供输入在每个类别中的概率。
在这个实验室中,您将看到一个在Tensorflow中构建多类网络的示例。然后我们将看看神经网络是如何进行预测的。
让我们从创建一个四类数据集开始。

2.1准备和可视化我们的数据

我们将使用Scikit Learn 的 make_blobs函数制作一个具有4个类别的训练数据集,如下图所示。

# make 4-class dataset for classification
classes = 4
m = 100
centers = [[-5, 2], [-2, -2], [1, 2], [5, -2]]
std = 1.0
X_train, y_train = make_blobs(n_samples=m, centers=centers, cluster_std=std,random_state=30)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这段代码的含义是生成一个用于分类任务的数据集,具体解释如下:

  1. classes = 4

    • 定义了数据集中的类别数量为 4。
  2. m = 100

    • 定义了数据集中样本的总数为 100。
  3. centers = [[-5, 2], [-2, -2], [1, 2], [5, -2]]

    • 定义了每个类别的中心点坐标,这里有 4 个类别,分别对应 4 个中心点坐标。
  4. std = 1.0

    • 定义了数据集中样本点的标准差,即控制样本点在中心点附近的分布范围。
  5. X_train, y_train = make_blobs(n_samples=m, centers=centers, cluster_std=std, random_state=30)

    • 使用 make_blobs 函数生成符合设定参数的聚类数据。
    • n_samples 参数指定了生成的样本数量为 m。
    • centers 参数指定了每个类别的中心点坐标。
    • cluster_std 参数指定了每个类别中样本点的标准差。
    • random_state 参数是随机种子,通过设置相同的 random_state 参数,可以确保每次运行生成的随机结果是相同的,从而方便实验复现和结果验证。

最终,X_train 是生成的特征数据,y_train 是对应的标签数据,用于训练一个分类模型。这段代码的目的是生成一个具有 4个类别的聚类数据集,用于进行分类模型的训练和评估。

plt_mc(X_train,y_train,classes, centers, std=std)
  • 1

在这里插入图片描述
每个点表示一个训练示例。轴(x0,x1)是输入,颜色表示与示例相关联的类。一旦训练好,模型将呈现一个新的例子,(x0,x1),并将预测类别。
在生成时,该数据集代表了许多现实世界中的分类问题。有几个输入特性(x0,…,xn)和几个输出类别。该模型被训练为使用输入特征来预测正确的输出类别。

# show classes in data set
print(f"unique classes {np.unique(y_train)}")
# show how classes are represented
print(f"class representation {y_train[:10]}")
# show shapes of our dataset
print(f"shape of X_train: {X_train.shape}, shape of y_train: {y_train.shape}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

输出:

unique classes [0 1 2 3]
class representation [3 3 3 0 3 3 3 3 2 0]
shape of X_train: (100, 2), shape of y_train: (100,)
  • 1
  • 2
  • 3

2.2模型

该实验室将使用如图所示的两层网络。与二进制分类网络不同,该网络有四个输出,每个类一个。给定一个输入示例,具有最高值的输出是输入的预测类。
以下是如何在Tensorflow中构建此网络的示例。请注意,输出层使用线性激活,而不是softmax激活。虽然可以在输出层中包括softmax,但如果在训练期间将线性输出传递给损失函数,则在数值上更稳定。如果该模型用于预测概率,则可以在该点应用softmax。在这里插入图片描述

tf.random.set_seed(1234)  # applied to achieve consistent results
model = Sequential(
    [
        Dense(2, activation = 'relu',   name = "L1"),
        Dense(4, activation = 'linear', name = "L2")
    ]
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

下面的语句编译和训练网络。将from_logits=True设置为损失函数的参数指定输出激活是线性的,而不是softmax。

model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=tf.keras.optimizers.Adam(0.01),
)

model.fit(
    X_train,y_train,
    epochs=200
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
通过训练模型,我们可以看到模型是如何对训练数据进行分类的。

plt_cat_mc(X_train, y_train, model, classes)
  • 1

在这里插入图片描述
上面,决策边界显示了模型是如何划分输入空间的。这个非常简单的模型对训练数据进行分类没有问题。它是如何做到这一点的?让我们更详细地了解网络。
下面,我们将从模型中提取训练后的权重,并使用它来绘制每个网络单元的函数。再往下看,对结果有更详细的解释。你不需要知道这些细节就可以成功地使用神经网络,但它可能有助于获得更多关于层如何组合来解决分类问题的直觉。

# gather the trained parameters from the first layer
l1 = model.get_layer("L1")
W1,b1 = l1.get_weights()
  • 1
  • 2
  • 3
# plot the function of the first layer
plt_layer_relu(X_train, y_train.reshape(-1,), W1, b1, classes)
  • 1
  • 2

在这里插入图片描述
有点看不懂,为啥会输出这样的结果???
继续往下看有解释

# gather the trained parameters from the output layer
l2 = model.get_layer("L2")
W2, b2 = l2.get_weights()
# create the 'new features', the training examples after L1 transformation
Xl2 = np.zeros_like(X_train)
Xl2 = np.maximum(0, np.dot(X_train,W1) + b1)

plt_output_layer_linear(Xl2, y_train.reshape(-1,), W2, b2, classes,
                        x0_rng = (-0.25,np.amax(Xl2[:,0])), x1_rng = (-0.25,np.amax(Xl2[:,1])))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
有点看不懂,为啥会输出这样的结果???
继续往下看有解释

解释

Layer 1
在这里插入图片描述

这些图显示了网络第一层中单元0和1的功能。输入为(

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/807454
推荐阅读
相关标签