过度拟合,过度训练或体系结构不正确

时间:2019-01-20 09:26:39

标签: keras conv-neural-network

我有一个6 * 32的技术数据数组,它们看起来像“射线”,连接六行中的一些或全部的局部最大值,并且上下颠倒地倾斜:

1:     100 (102) 97  98 127 120 121
2:      88  87  (91) 90  88  88  88
3:     101 100  101 100 101 100 100
4:      99  97   97  98 (99) 98  97
5: ...
6: ...

我的基本想法是使用CNN网络,因为当前操作员可以直观地检测到这些模式,并且与文本或照片对象识别相比,问题似乎并不那么困难。我使用Keras,以下架构可提供最佳效果。不幸的是,只有在训练中。

model = keras.Sequential([
    keras.layers.BatchNormalization(input_shape=( 6, 32, 1)),

    keras.layers.Conv2D(filters=32, kernel_size=2, activation='tanh', padding="same"),
    keras.layers.Conv2D(filters=32, kernel_size=2, activation='tanh', padding="same"),
    keras.layers.MaxPooling2D(2),
    keras.layers.Conv2D(filters=16, kernel_size=3, activation='tanh', padding="same"),
    keras.layers.Conv2D(filters=16, kernel_size=3, activation='tanh', padding="same"),
    keras.layers.MaxPooling2D(2),
    keras.layers.Conv2D(filters=8, kernel_size=4, activation='tanh', padding="same"),
    keras.layers.Conv2D(filters=8, kernel_size=4, activation='tanh', padding="same"),

    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(8096, activation=tf.nn.tanh),
    keras.layers.Dropout(0.6),
    keras.layers.Dense(8096, activation=tf.nn.relu),
    keras.layers.Dropout(0.6),

    keras.layers.Dense(1, activation=tf.nn.sigmoid)
    ])

编译:

model.compile(optimizer=keras.optimizers.RMSprop(), 
          loss='binary_crossentropy',
          metrics=['accuracy'])

培训:

model.fit(train_data, train_labels, epochs=200, batch_size=128)

在训练中会损失〜0.1667精度〜0.9480 在测试中,准确性仅为61%。

1 个答案:

答案 0 :(得分:1)

您最有可能遇到过拟合问题,因此您需要在训练过程中增加正则化

首先(作为经验法则,应该始终这样做),通过在每个图层上添加以下参数来增加权重大小的正则化:

kernel_regularizer=keras.regularizers.l2(w_reg)

所以您的每一层都应该像这样:

keras.layers.Conv2D(filters=32,
                    kernel_size=2,
                    activation='tanh',
                    padding="same",
                    kernel_regularizer=keras.regularizers.l2(w_reg))

其他观察结果:

我认为您的模型对于输入的大小来说太宽了,因此它很容易记住训练数据和过度拟合。您正在将具有8096个神经元的密集层用于192个变量的输入和单个输出。我认为这是一个过度杀伤,您应将大小最大减少到数百个神经元。如果我做错了,您会发现您的训练精度未达到90年代的最高水平,并且您随时可以添加神经元。

我注意到您正在对输入使用批处理规范化。在标准情况下,它不会完成。您应该对输入进行归一化,但是通常是在模型之外通过减去训练集的平均值,然后将其除以每个样本中训练集的方差(是的,所有样本包括测试集的样本以及未来的样本用训练集的均值和方差归一化。)

我还注意到您在模型中使用了2种不同的激活函数(不包括输出中的S型信号),是故意这样做还是会出错?