当前位置: 首页 > 知识库问答 >
问题:

为什么我的模型在第二个纪元时过度拟合?

壤驷华辉
2023-03-14

我是一名深度学习的初学者,我正在尝试使用Mobilenet_v2和Inception训练一个深度学习模型,以对不同的ASL手势进行分类。

下面是我的代码创建一个ImageDataGenerator,用于创建培训和验证集。

# Reformat Images and Create Batches

IMAGE_RES = 224
BATCH_SIZE = 32

datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    validation_split = 0.4
)

train_generator = datagen.flow_from_directory(
    base_dir,
    target_size = (IMAGE_RES,IMAGE_RES),
    batch_size = BATCH_SIZE,
    subset = 'training'
)

val_generator = datagen.flow_from_directory(
    base_dir,
    target_size= (IMAGE_RES, IMAGE_RES),
    batch_size = BATCH_SIZE,
    subset = 'validation'
)

以下是培训模型的代码:

# Do transfer learning with Tensorflow Hub
URL = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"
feature_extractor = hub.KerasLayer(URL,
                                   input_shape=(IMAGE_RES, IMAGE_RES, 3))
# Freeze pre-trained model
feature_extractor.trainable = False

# Attach a classification head
model = tf.keras.Sequential([
  feature_extractor,
  layers.Dense(5, activation='softmax')
])

model.summary()

# Train the model
model.compile(
  optimizer='adam',
  loss='categorical_crossentropy',
  metrics=['accuracy'])

EPOCHS = 5

history = model.fit(train_generator,
                    steps_per_epoch=len(train_generator),
                    epochs=EPOCHS,
                    validation_data = val_generator,
                     validation_steps=len(val_generator)
                    )

纪元1/5 94/94[===========================================================================-19s 199ms/步长-损耗:0.7333-精度:0.7730-val_损耗:0.6276-val_精度:0.7705

纪元2/5 94/94 [==============================] - 18s 190ms/步损: 0.1574-精度: 0.9893-val_loss: 0.5118-val_accuracy: 0.8145

纪元3/5 94/94[=====================================================================-18s 191ms/步长-损耗:0.0783-精度:0.9980-val\u损耗:0.4850-val\u精度:0.8235

纪元4/5 94/94 [==============================] - 18s 196毫秒/步损: 0.0492-精度: 0.9997-val_loss: 0.4541-val_accuracy: 0.8395

纪元5/5 94/94 [==============================] - 18s 193ms/阶跃-损耗: 0.0349-精度: 0.9997-val_loss: 0.4590-val_accuracy: 0.8365

我尝试过使用数据增强,但是模型仍然过适合,所以我想知道我的代码是否有错误。

共有1个答案

蔡理
2023-03-14

您的数据非常小。尝试使用随机种子进行分割,并检查问题是否仍然存在。

如果是,那么使用正则化,降低神经网络的复杂性。

还可以尝试使用不同的优化器和较小的学习率(尝试lr scheduler)

 类似资料:
  • 这是我的CNN模型结构。 结果表明,该模型与训练数据吻合较好,验证数据的验证精度波动较大。 在7352个样本上训练,在2947个样本上验证Epoch 1/3000 7352/7352[===============================================================-3s 397us/样本-损失:0.1016-精度:0.9698-val损失:4.0896

  • 我正在研究如何使用Mockito和Junit,现在测试一些片段。我不明白为什么我在Mock注释后在下面的代码中有NPE: 但是代码的第一部分工作得很好,尽管据我所知,这两个部分都是这样做的。 编辑:堆栈跟踪: null

  • 下面是所讨论的程序的摘录。矩阵的大小为size×size,并在以下位置初始化: 然后,创建一个矩阵,这里的每个字段都是img矩阵中围绕它的9个字段的平均值。为了简单起见,边框留在0。 这就是节目的全部内容。为了完整起见,下面是前面的内容。后面没有代码。正如您所看到的,这只是初始化。 基本上,当大小是2048的倍数时,该程序是缓慢的,例如执行次数: 编译器是gcc。据我所知,这是因为内存管理,但我对

  • 问题内容: 我的问题很清楚解释: 如果我这样做: 我得到以下输出:1970年1月1日星期四01:00:00 根据文档,我期望:1970年1月1日星期四00:00:00 CET 我想错了… 编辑:的确,我读文档太快了。1970年1月1日星期四00:00:00我应该有 那么,如何强制使用GMT并忽略所有本地时间? 编辑,解决方案: 问题答案: 该大纪元定义为00:00:00 1970-1-1上UTC。

  • 我的代码有问题。由于某些原因,它不会显示我的第二个按钮b2,并且我无法设置第一个按钮的大小。我想在中间有两个按钮,中间有一些空间。

  • 问题内容: 我有这种方法,可以在登录前检查用户名和密码。现在,我的for循环仅检查第一个项目,它发现第一个项目不满足第一个条件,因此与其去检查第二个项目,它只是中断并返回null。 为什么会这样? 这是我的方法: 问题答案: 因此,请尝试此代码。