赞
踩
在这个实验室里,你将探索一个使用神经网络进行多类分类的例子。
您将使用一些打印例程。这些存储在此目录中的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)
神经网络通常用于对数据进行分类。例如神经网络:
这种类型的网络在其最后一层将具有多个单元。每个输出都与一个类别相关联。当输入示例应用于网络时,具有最高值的输出是预测的类别。如果将输出应用于softmax函数,则softmax的输出将提供输入在每个类别中的概率。
在这个实验室中,您将看到一个在Tensorflow中构建多类网络的示例。然后我们将看看神经网络是如何进行预测的。
让我们从创建一个四类数据集开始。
我们将使用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)
这段代码的含义是生成一个用于分类任务的数据集,具体解释如下:
classes = 4
:
- 定义了数据集中的类别数量为 4。
m = 100
:
- 定义了数据集中样本的总数为 100。
centers = [[-5, 2], [-2, -2], [1, 2], [5, -2]]
:
- 定义了每个类别的中心点坐标,这里有 4 个类别,分别对应 4 个中心点坐标。
std = 1.0
:
- 定义了数据集中样本点的标准差,即控制样本点在中心点附近的分布范围。
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)
每个点表示一个训练示例。轴(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}")
输出:
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,)
该实验室将使用如图所示的两层网络。与二进制分类网络不同,该网络有四个输出,每个类一个。给定一个输入示例,具有最高值的输出是输入的预测类。
以下是如何在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")
]
)
下面的语句编译和训练网络。将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
)
通过训练模型,我们可以看到模型是如何对训练数据进行分类的。
plt_cat_mc(X_train, y_train, model, classes)
上面,决策边界显示了模型是如何划分输入空间的。这个非常简单的模型对训练数据进行分类没有问题。它是如何做到这一点的?让我们更详细地了解网络。
下面,我们将从模型中提取训练后的权重,并使用它来绘制每个网络单元的函数。再往下看,对结果有更详细的解释。你不需要知道这些细节就可以成功地使用神经网络,但它可能有助于获得更多关于层如何组合来解决分类问题的直觉。
# gather the trained parameters from the first layer
l1 = model.get_layer("L1")
W1,b1 = l1.get_weights()
# plot the function of the first layer
plt_layer_relu(X_train, y_train.reshape(-1,), W1, b1, classes)
有点看不懂,为啥会输出这样的结果???
继续往下看有解释
# 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])))
有点看不懂,为啥会输出这样的结果???
继续往下看有解释
Layer 1
这些图显示了网络第一层中单元0和1的功能。输入为(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。