在 Python 中具有恒定精度的 CNN 模型

CNN Model with constant accuracy in Python

我是 Python 的初学者,遇到以下问题:

我需要使用数据集 GTZAN 创建一个用于音乐流派识别的 CNN,我按照在线教程得出了以下代码:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, Input

X = X/255.0

#First Layer
Model = Sequential()
Model.add(Conv2D(64, (3, 3), input_shape = X.shape[1:]))
Model.add(Activation("relu"))
Model.add(MaxPooling2D(pool_size=(2, 2)))
Model.add(Dropout (0.2))

#Second Layer
Model.add(Conv2D(64, (3, 3)))
Model.add(Activation("relu"))
Model.add(MaxPooling2D(pool_size=(2, 2)))
Model.add(Dropout (0.2))

#Third Layer
Model.add(Flatten())
Model.add(Dense(64))
Model.add(Activation("relu"))
Model.add(Dropout (0.2))

#Output Layer
Model.add(Dense(1))
Model.add(Activation("softmax"))

#Compiling the Model
Model.compile(loss="categorical_crossentropy", #Suitable for datasets of 2 or more labels
              optimizer="adam",
              metrics=['accuracy']) #Calculates how often predictions equal labels.

Model.fit(X, y, batch_size=25, epochs=6, validation_split=0.1)

然而,当我 运行 模型时,我在所有时期都有一个恒定的精度(上面的模型为 0.1023),我无法弄清楚为什么。我想问题一定出在我的代码上,否则每个时期之间的准确性至少会略有不同。

提前感谢您的帮助!

在 1 个单元的密集层上使用 softmax 激活函数没有意义,因为它总是 returns 1.0

的输出

您希望模型的输出概率为类,因此将最终密集层中的单元数设置为您拥有的类个数。

恒定的准确性可能是恒定输出的标志。查看准确性的缺点作为衡量标准。如果 99% 的样本属于相同的 class(例如“pop”),则始终输出“genre is pop”的网络将获得 >99% 的准确度。