【发布时间】:2019-09-29 20:59:24
【问题描述】:
我正在尝试使用Keras 在Google QuickDraw 绘图上训练分类器:
import numpy as np
from tensorflow.keras.layers import Conv2D, Dense, Flatten, MaxPooling2D
from tensorflow.keras.models import Sequential
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=5, data_format="channels_last", activation="relu", input_shape=(28, 28, 1)))
model.add(MaxPooling2D(data_format="channels_last"))
model.add(Conv2D(filters=16, kernel_size=3, data_format="channels_last", activation="relu"))
model.add(MaxPooling2D(data_format="channels_last"))
model.add(Flatten(data_format="channels_last"))
model.add(Dense(units=128, activation="relu"))
model.add(Dense(units=64, activation="relu"))
model.add(Dense(units=4, activation="softmax"))
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])
x = np.load("./x.npy")
y = np.load("./y.npy")
model.fit(x=x, y=y, batch_size=100, epochs=40, validation_split=0.2)
输入数据是一个 4d 数组,每类包含 12000 个标准化图像 (28 x 28 x 1)。输出数据是一个热编码向量的数组。
如果我在四个类上训练这个模型,它会产生令人信服的结果:
(红色为训练数据,蓝色为验证数据)
我知道该模型略微过度拟合。但是,我希望架构尽可能简单,所以我接受了。
我的问题是,只要我添加一个任意类,模型就会开始过度拟合:
我尝试了许多不同的方法来防止它过度拟合,例如 Batch Normalization、Dropout、Kernel Regularizers、更多的训练数据和不同的批量大小,但都没有带来任何显着的改进。
我的 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 文件来自here。
【问题讨论】:
标签: tensorflow machine-learning keras deep-learning conv-neural-network