接收V3迁移学习与Keras过度拟合太早

接收V3迁移学习与Keras过度拟合太早,keras,deep-learning,conv-neural-network,Keras,Deep Learning,Conv Neural Network,我在Keras上使用预先训练好的InceptionV3对模型进行再训练,以进行二值图像分类(标记为0和1的数据) 用从未见过的数据,我的k-fold验证的准确率已经达到了65%,但问题是模型很快就会过度拟合。我需要提高平均精度,我想这与过度拟合问题有关 以下是历元的损失值: 这是代码。数据集和标签变量是Numpy数组 dataset = joblib.load(path_to_dataset) labels = joblib.load(path_to_labels) le = LabelEn

我在Keras上使用预先训练好的InceptionV3对模型进行再训练,以进行二值图像分类(标记为0和1的数据)

用从未见过的数据,我的k-fold验证的准确率已经达到了65%,但问题是模型很快就会过度拟合。我需要提高平均精度,我想这与过度拟合问题有关

以下是历元的损失值:

这是代码。数据集和标签变量是Numpy数组

dataset = joblib.load(path_to_dataset)
labels = joblib.load(path_to_labels)

le = LabelEncoder()
labels = le.fit_transform(labels)
labels = to_categorical(labels, 2)

X_train, X_test, y_train, y_test = sk.train_test_split(dataset, labels, test_size=0.2)
X_train, X_val, y_train, y_val = sk.train_test_split(X_train, y_train, test_size=0.25) # 0.25 x 0.8 = 0.2

X_train = np.array(X_train)
y_train = np.array(y_train)
X_val = np.array(X_val)
y_val = np.array(y_val)
X_test = np.array(X_test)
y_test = np.array(y_test)

aug = ImageDataGenerator(
        rotation_range=20,
        zoom_range=0.15,
        horizontal_flip=True,
        fill_mode="nearest")

pre_trained_model = InceptionV3(input_shape = (299, 299, 3),
                                  include_top = False,
                                  weights = 'imagenet')

for layer in pre_trained_model.layers:
    layer.trainable = False

x = layers.Flatten()(pre_trained_model.output)
x = layers.Dense(1024, activation = 'relu')(x)
x = layers.Dropout(0.2)(x)
x = layers.Dense(2, activation = 'softmax')(x) #already tried with sigmoid activation, same behavior

model = Model(pre_trained_model.input, x)
model.compile(optimizer = RMSprop(lr = 0.0001),
                loss = 'binary_crossentropy',
                metrics = ['accuracy']) #Already tried with Adam optimizer, same behavior

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=100)
mc = ModelCheckpoint('best_model_inception_rmsprop.h5', monitor='val_accuracy', mode='max', verbose=1, save_best_only=True)

history = model.fit(x=aug.flow(X_train, y_train, batch_size=32),
                      validation_data = (X_val, y_val),
                      epochs = 100,
                      callbacks=[es, mc])
训练数据集有2181个图像,验证有727个图像

有点不对劲,但我不知道


有什么办法可以改进它吗?

避免过度拟合的一种方法是使用大量数据。发生过度拟合的主要原因是因为您有一个小数据集,并且您试图从中学习。该算法将对这个小数据集有更大的控制,并将确保它精确地满足所有数据点。但是如果你有大量的数据点,那么这个算法就不得不进行推广,并提出一个适合大多数数据点的好模型。 建议:

  • 使用大量数据
  • 如果您有少量数据样本,请使用较低深度的网络
  • 如果第二个满足,那么不要使用大量的时代线索-使用许多时代线索有点迫使你的模型学习,你的模型会学得很好,但不能概括

  • 一种避免过度拟合的方法是使用大量数据。发生过度拟合的主要原因是因为您有一个小数据集,并且您试图从中学习。该算法将对这个小数据集有更大的控制,并将确保它精确地满足所有数据点。但是如果你有大量的数据点,那么这个算法就不得不进行推广,并提出一个适合大多数数据点的好模型。 建议:

  • 使用大量数据
  • 如果您有少量数据样本,请使用较低深度的网络
  • 如果第二个满足,那么不要使用大量的时代线索-使用许多时代线索有点迫使你的模型学习,你的模型会学得很好,但不能概括

  • 从您的损失图中,我看到该模型是在早期的(火车和val分数相交)进行推广的,因此请尝试使用在该时期保存的模型(而不是后期似乎过拟合的时期)
    第二种选择是使用大量的训练样本

    如果您的训练样本数量较少,则从您的损失图中使用数据增强,我发现该模型在早期阶段进行了推广(其中存在训练和val分数的交叉点),因此请尝试使用在该阶段保存的模型(而不是后期阶段,该阶段似乎过拟合)
    第二种选择是使用大量的训练样本

    如果您的训练样本数量较少,则使用数据增强

    您是否尝试过以下方法

  • 使用更高的退出值
  • 学习率较低(lr=0.00001或lr=0.000001…)
  • 您可以使用更多的数据扩充
  • 在我看来,你的数据量很低。您可以使用较低的比率进行测试和验证(10%,10%)

  • 你试过跟随吗

  • 使用更高的退出值
  • 学习率较低(lr=0.00001或lr=0.000001…)
  • 您可以使用更多的数据扩充
  • 在我看来,你的数据量很低。您可以使用较低的比率进行测试和验证(10%,10%)