为什么这个 ML 模型的准确度为零?

Why is this ML model giving me zero accuracy?

我正在尝试在 Swiss Roll dataset 上训练一个具有三个特征 X = [x1, x2, x3] 的网络用于分类任务。有四个 类,标签为 1、2、3、4,向量 y 包含所有数据的标签。

X 矩阵中的一行如下所示:

-5.2146470e+00   7.0879738e+00   6.7292474e+00

X的形状是(100, 3),y的形状是(100,)。

我想使用径向基函数来训练这个模型。我使用了 Whosebug answer (also see this 解释中的自定义 RBFLayer)来构建 RBFLayer。我想使用几个 Keras 密集层来构建分类网络。

到目前为止我尝试了什么

我在第一层使用了 Dense 层,然后是自定义 RBFLayer,以及另外两个 Dense 层。这是代码:

model = Sequential()
model.add((Dense(100, input_dim=3)))
# number of units = 10, gamma = 0.05
model.add(RBFLayer(10,0.05))
model.add(Dense(15, activation='relu'))
model.add(Dense(1, activation='softmax'))

这个模型给我的准确度为零。我认为模型架构有问题,但我无法弄清楚问题是什么。

此外,我认为最后一个 Dense 层中的单元数应该与 类 的数量相匹配,在本例中为 4。但是当我在最后一层将单元数设置为4时,出现以下错误:

ValueError: Shapes (None, 1) and (None, 4) are incompatible

你能帮我看看这个模型架构吗?

我在练习多class class化时遇到了同样的问题。我有 7 个特征,模型 class 变成 7 classes。我尝试对标签进行编码并解决了问题。

首先从 sklearn 导入 LabelEncoder class 并从 tensorflow

导入 to_categorical
from sklearn.preprocessing import LabelEncoder
from tensorflow.keras.utils import to_categorical

然后,将对象初始化为 LabelEncoder class 并在拟合和训练模型之前转换标签。

encoder = LabelEncoder()
encoder.fit(y)
y = encoder.transform(y)
y = to_categorical(y)

请注意,您必须使用 np.argmax 才能获得实际预测的 class 化。在我的例子中,预测存储在名为 res

的变量中
res = np.argmax(res, axis=None, out=None)

你可以在这行之后得到你实际预测的class。期待为您提供帮助。希望它解决了你的问题。

There are four classes with labels 1, 2, 3, 4, and the vector y contains the labels for all the data.

输入输出匹配的最简单解决方案是打印单个批次的输入和输出形状,然后进行比较。

RBF 层应该没有问题,因为输出来自最后一个密集层而不是 RBF 层。

对于分类问题,你必须让最后一个节点等于 类 在回归中最后一个节点有时是 1。

你应该打印

伪代码

打印(input.shape)

比较

打印(model.input_shape)

然后在输出

打印(output.shape)

然后与

比较

print(model.predict(输入).shape)

您可以在 keras 文档中找到正确的语法,这些是大致正确的语法/伪