Python 与准确度相比,Keras top_k_分类准确度指标极低

Python 与准确度相比,Keras top_k_分类准确度指标极低,python,tensorflow,keras,Python,Tensorflow,Keras,我使用Keras的cifar100数据集创建了一个CNN模型。当添加top_k_Category_精度度量时,我应该看到前5个预测类中的一个是正确类时的精度。然而,在培训时,top_k_分类准确率仍然很低,约为4-5%,因为准确率和验证准确率一直增加到40-50%。前5名的准确度应该比正常的准确度高得多,而不是给出非常奇怪的结果。我使用不同的k值编写了自己的度量,但仍然存在相同的问题。即使当我使用k=1时,也会出现同样的问题,因为k=1应该给出相同的精度值 型号代码: cnn = Sequent

我使用Keras的cifar100数据集创建了一个CNN模型。当添加top_k_Category_精度度量时,我应该看到前5个预测类中的一个是正确类时的精度。然而,在培训时,top_k_分类准确率仍然很低,约为4-5%,因为准确率和验证准确率一直增加到40-50%。前5名的准确度应该比正常的准确度高得多,而不是给出非常奇怪的结果。我使用不同的k值编写了自己的度量,但仍然存在相同的问题。即使当我使用k=1时,也会出现同样的问题,因为k=1应该给出相同的精度值

型号代码:

cnn = Sequential()
cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu', input_shape=(train_images.shape[1:])))
cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu'))
cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu'))
cnn.add(MaxPooling2D(pool_size=2, padding='same'))
cnn.add(Dropout(0.4))

cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu'))
cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu'))
cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu'))
cnn.add(Conv2D(filters=200, kernel_size=2, padding='same', activation='relu'))
cnn.add(Dropout(0.4))
cnn.add(MaxPooling2D(pool_size=2, padding='same'))
cnn.add(Dropout(0.5))

cnn.add(Flatten())
cnn.add(Dense(550, activation='relu'))
cnn.add(Dropout(0.4))
cnn.add(Dense(100, activation='softmax'))
编译代码:

cnn.compile(loss='sparse_categorical_crossentropy', optimizer=opt.Adam(lr=learn_rate), metrics=['accuracy', 'top_k_categorical_accuracy'])

事实证明,因为我使用的是稀疏的分类的交叉熵损失函数,所以我需要使用稀疏的top分类的精度函数。此度量还要求将标签展平到一维。之后,度量是正确的,模型正在训练

由于您使用了
sparse\u category\u crossentropy
作为损失,因此标签似乎是稀疏的(即,您没有对它们进行热编码)。如果是这样的话,那么你需要使用
sparse\u top\u k\u categorical\u accurity
作为度量标准。哇,我甚至没有看到这一点。非常感谢你。我还在源代码中看到标签需要从(samples,1)展平到(samples,)。这样做后,它的工作!你是我朋友的救命恩人。