我试图训练LeNet 5的16输出的灰度图像的大小(30x30x1)。我在Keras中使用Adam优化器,对12800个没有丢失和正则化的样本进行了尝试,在400个批次大小为100的历元后,训练准确率达到了100%,而没有辍学和正则化者的验证精度达到了65%。
我尝试了增加数据,添加了L2正则化和Dropout,但是验证的准确性并没有得到很大的提高,而不是发散。
你能建议我如何着手解决这个过度拟合问题(afaik)吗?
发布于 2020-08-06 03:11:34
你可以尝试一些事情:
发布于 2020-08-06 06:21:37
扩展了jakub给出的优秀指针。
train_dir =‘/数据/培训’ validation_dir =‘/数据/验证’
现在要做的第一件事是将每个像素除以255,这样它们就可以在0到1之间重新缩放。在此基础上,通过各种转换(如剪切、旋转、缩放、翻转等)来增加数据通常是有好处的,因为它在一定程度上推广了模型。这两种方法都可以使用ImageDataGenerator模块实现,如下所示:
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Add our data-augmentation parameters to ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255.,
rotation_range = 40,
width_shift_range = 0.2,
height_shift_range = 0.2,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator( rescale = 1.0/255. )
# Flow training images in batches of 100 using train_datagen generator
train_generator = train_datagen.flow_from_directory(train_dir,
batch_size = 100,
class_mode = 'binary',
target_size = (30, 30))
# Flow validation images in batches of 100 using test_datagen generator
validation_generator = test_datagen.flow_from_directory(validation_dir,
batch_size = 100,
class_mode = 'binary',
target_size = (30, 30))所有这些都很好,但不幸的是,它不会考虑验证集的准确性。为了解决这个问题,我们可以引入一个名为“早期停止”的正则化程序,它将帮助我们在验证精度停止提高时立即停止训练。如果你看一下你分享的图表,验证的准确性会在大约25个年代达到峰值。在那之后你很可能太适合了。一个关于角化病早期停止的引物是可用的这里。因此,让我们实例化这两个回调,并在培训阶段使用它们。
# Define a Callback class that stops training once accuracy reaches 98%
class MyCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('acc')>0.99):
print("\nReached 99% accuracy so cancelling training!")
self.model.stop_training = True
training_clbk = MyCallback()
# Define the early stopping Callback
early_stopper_clbk = tf.keras.callbacks.EarlyStopping(
monitor="val_loss",
min_delta=0,
patience=0,
verbose=0,
mode="auto",
baseline=None,
restore_best_weights=False,
)
history = model.fit_generator(
train_generator,
epochs=100,
validation_data=validation_generator,
callbacks = [training_clbk, early_stopper_clbk],
verbose=2)这应该能解决你面临的一些可能的过度适应问题。当然,退出比赛和正规化在大多数情况下都是有帮助的,所以请你也玩一玩。
https://stackoverflow.com/questions/63276239
复制相似问题