Val损失的价值真的很差

数据挖掘 机器学习 Python 神经网络 深度学习 喀拉斯
2021-09-28 06:06:00

我正在使用 GTZAN 数据集制作 CNN 并按音乐流派进行分类。

除了 Val,我得到了很好的结果。损失(见图)

结果

我正在使用 Librosa 处理音频文件,获取频谱图,然后使用 power_to_db 函数。

这是我的 CNN 模型:

class CNNModel(object):

def __init__(self, config, X):
    self.filters = 32 # number of convolutional filters to use
    self.pool_size = (2, 2)  # size of pooling area for max pooling
    self.kernel_size = (3, 3)  # convolution kernel size
    self.nb_layers = 4
    self.input_shape = (128, 625, 1) # cambiar por x.shape
    
    
def build_model(self, nb_classes):

    model = Sequential()
    model.add(
            Conv2D(
                self.filters,
                self.kernel_size,
                padding ='same',
                input_shape = self.input_shape))
    model.add(BatchNormalization(axis=1))
    model.add(Activation('relu'))
    
    model.add(
            Conv2D(
                self.filters,
                self.kernel_size))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size = self.pool_size))
    model.add(Dropout(0.25))
    
    model.add(
        Conv2D(
            self.filters + 32,
            self.kernel_size,
            padding ='same'))
    model.add(Activation('relu'))
    
    model.add(
        Conv2D(
            self.filters + 32,
            self.kernel_size,
            padding ='same'))
    model.add(MaxPooling2D(pool_size = self.pool_size))
    model.add(Dropout(0.25))
         
    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation("softmax")) #mirar
    
    return model

如果您想查看整个代码,我会留下我的 github 的链接。

每首歌都是 (128, 625) 形状,我使用 MinMaxScale 来缩放数据。

这是我的损失函数和优化器

loss = losses.categorical_crossentropy,
optimizer = optimizers.SGD(lr=0.001, momentum=0, decay=1e-5, nesterov=True)

我读过关于过度拟合的文章,这似乎是原因,但我不知道如何在代码级别解决它。

更新 1:使用 Dropout(0.9) 我得到了这个结果: 结果 2 谢谢

1个回答

您可以使用更高的 Dropout (0.5,0.7,0.9) 值进行测试和/或尝试 L1/L2 正则化以对抗过度拟合:Keras Regularizers

更新:您可以在卷积层和 FC 层中使用 l1/l2 正则化和 dropout 的组合。从 lambda (0.001) 的低值开始并在此基础上增加它。一种常见的做法是仅在 FC 层中使用 dropout,看看它是否对您的问题有帮助。

此外,从您的损失曲线来看,您的模型可能尚未收敛。您可以对其进行训练,直到您的验证损失开始上升/变得稳定。