Tensorflow Keras CNN对四个以上的班级进行了过度装修

Tensorflow Keras CNN对四个以上的班级进行了过度装修,tensorflow,machine-learning,keras,deep-learning,conv-neural-network,Tensorflow,Machine Learning,Keras,Deep Learning,Conv Neural Network,我正在尝试使用以下方法在图纸上训练分类器: 输入数据是一个4d数组,每个类有12000个标准化图像(28 x 28 x 1)。输出数据是一个热编码向量的数组 如果我在四个班上训练这个模型,它会产生令人信服的结果: (红色为培训数据,蓝色为验证数据) 我知道这个型号有点太合适了。然而,我想让架构尽可能简单,所以我接受了这一点 我的问题是,只要我添加一个任意类,模型就开始过度拟合: 我尝试了许多不同的方法来防止它过度拟合,比如批标准化、退出、内核正则化、更多的训练数据和不同的批大小,但没有一

我正在尝试使用以下方法在图纸上训练分类器:

输入数据是一个4d数组,每个类有12000个标准化图像(28 x 28 x 1)。输出数据是一个热编码向量的数组

如果我在四个班上训练这个模型,它会产生令人信服的结果:

(红色为培训数据,蓝色为验证数据)

我知道这个型号有点太合适了。然而,我想让架构尽可能简单,所以我接受了这一点

我的问题是,只要我添加一个任意类,模型就开始过度拟合:

我尝试了许多不同的方法来防止它过度拟合,比如批标准化、退出、内核正则化、更多的训练数据和不同的批大小,但没有一种方法带来任何显著的改进

是什么原因导致我的CNN过多


编辑:这是我用来创建
x.npy
y.npy
的代码:

import numpy as np

from tensorflow.keras.utils import to_categorical

files = ['cat.npy', 'dog.npy', 'apple.npy', 'banana.npy', 'flower.npy']

SAMPLES = 12000

x = np.concatenate([np.load(f'./data/{f}')[:SAMPLES] for f in files]) / 255.0
y = np.concatenate([np.full(SAMPLES, i) for i in range(len(files))])

# (samples, rows, cols, channels)
x = x.reshape(x.shape[0], 28, 28, 1).astype('float32')
y = to_categorical(y)

np.save('./x.npy', x)
np.save('./y.npy', y)

.npy
文件来自。

问题在于如何进行数据拆分。请注意,有5个类,您可以执行
0.2
验证拆分。默认情况下,没有无序处理,并且在代码中按顺序提供数据。这意味着:

  • 训练数据完全由4个类组成:“cat.npy”、“dog.npy”、“apple.npy”、“banana.npy”。这就是
    0.8
    训练分割
  • 测试数据为“flower.npy”。这是您的
    0.2
    验证分割。该模型从未接受过这方面的训练,因此其准确性非常差
这样的结果只有在
验证\u split=0.2
的情况下才可能出现,因此您可以接近完美的类分离

解决方案

x = np.load("./x.npy")
y = np.load("./y.npy")

# Shuffle the data!
p = np.random.permutation(len(x))
x = x[p]
y = y[p]

model.fit(x=x, y=y, batch_size=100, epochs=40, validation_split=0.2)

如果我的假设是正确的,那么将
验证\u split
设置为例如
0.5
也会得到更好的结果(尽管这不是一个解决方案)。

“如果你已经对四个类进行了严重的拟合”-如果你只看前几(5)个时期,你会看到相当不错的曲线。我多次运行训练过程,模型的精度始终达到90%以上。在6个历元之后,我得到的最好的结果是95%,这对我的用例来说已经足够了,我对此感到满意。“删除DeSE1;用3x3内核添加更多的VNET5;5x5内核是相当大的,考虑使它更小;考虑完全删除池层。”-我试过了所有这些,没有一个改进了任何东西。“考虑完全移除中等密度层。”-你说的中等密度层是什么意思?“你能为它粘贴代码吗?”-我使用了完全相同的模型(除了一个额外的输出神经元)。-“这几乎是不可能的。”。“-这也正是让我困惑的地方。这就是我在这里提问的原因,希望有人能知道问题出在哪里。@Scriptim这正是我要求粘贴确切代码的原因。然而,细微的差别似乎是它的主要嫌疑。也许可以粘贴要点?
x = np.load("./x.npy")
y = np.load("./y.npy")

# Shuffle the data!
p = np.random.permutation(len(x))
x = x[p]
y = y[p]

model.fit(x=x, y=y, batch_size=100, epochs=40, validation_split=0.2)