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

问题与早期停止在tf.keras

楚宏胜
2023-03-14

我正在训练我的第一个转移学习模式(耶!)当验证损失在超过3个时期内没有变化超过0.1时,我很难让模型停止训练。

下面是相关的代码块

early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1)

model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'],
          callbacks=[early_stopping])

EPOCHS = 100

history = model.fit(training_batches,
                epochs=EPOCHS,
                validation_data=validation_batches)

下面是一些日志:

    Epoch 32/100
    155/155 [==============================] - 21s 134ms/step - loss: 0.0042 - accuracy: 0.9998 - val_loss: 0.3407 - val_accuracy: 0.9012
    Epoch 33/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0040 - accuracy: 0.9998 - val_loss: 0.3443 - val_accuracy: 0.9000
    Epoch 34/100
    155/155 [==============================] - 21s 134ms/step - loss: 0.0037 - accuracy: 0.9998 - val_loss: 0.3393 - val_accuracy: 0.9019
    Epoch 35/100
    155/155 [==============================] - 21s 135ms/step - loss: 0.0031 - accuracy: 1.0000 - val_loss: 0.3396 - val_accuracy: 0.9000
    Epoch 36/100
    155/155 [==============================] - 21s 134ms/step - loss: 0.0028 - accuracy: 1.0000 - val_loss: 0.3390 - val_accuracy: 0.9000
    Epoch 37/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9025
    Epoch 38/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0024 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.8994
    Epoch 39/100
    155/155 [==============================] - 21s 133ms/step - loss: 0.0022 - accuracy: 1.0000 - val_loss: 0.3386 - val_accuracy: 0.9019

问题:

  • 为什么训练没有在第37纪元停止,因为我设置了早期停止回调来监控Valu损失
  • 我可以做更复杂的提前终止回调吗?类似于“如果值”的东西

共有2个答案

卫浩瀚
2023-03-14

patience=3减少到更小,例如12,然后看看会发生什么。

它告诉Keras你有多努力。耐心=少数人会告诉Keras尽早停止训练。另一方面,如果你使用一个大的数字,它会告诉Keras等待,直到达到相当大的精度

耐心:产生监测量而没有改善的时期数,之后训练将停止。如果验证频率(model.fit(validation_freq=5))大于1,则不能为每个纪元生成验证数量

楚翰
2023-03-14

编辑

它不起作用,因为你把回调参数放在了错误的方法调用中。(事实上,当我用传递给编译回调来拟合模型时,我收到了一个无效的参数错误。因此,我不知道为什么你的模型编译没有问题。(

它应该在fi方法中,如下所示。请注意,建议在早期停止配置中设置详细=1,以便打印出早期停止日志。

early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3, min_delta = 0.1, verbose = 1)

model.compile(optimizer='adam',
          loss='sparse_categorical_crossentropy',
          metrics=['accuracy'])

EPOCHS = 100

history = model.fit(training_batches,
                epochs=EPOCHS,
                callbacks=[early_stopping], # call back should be here!
                validation_data=validation_batches)

关于你的第二个问题,自定义回调是可能的,你可以参考留档的例子。基本上,您必须在on_epoch_end中定义早期停止逻辑。

另一方面,我认为您不应该过早地停止使用多个指标,选择一个重要的指标(即您正在优化的指标-val\u accurity),然后监控它。甚至有不鼓励提前停车的来源

 类似资料:
  • 我有一套和一个方法: 我可以终止lambda内部的forEach吗(使用或不使用异常)?我应该使用匿名类吗? 我可以这样做: 我正在寻找最快的解决方案,所以异常和一个'real'为每个循环是可以接受的,如果他们是足够快的。

  • 由于限制,我需要在第一次启动时下载一个wav文件。 我将该文件托管在服务器上。 我已经检查过了,我在服务器上有完整的文件,我也验证过了,用管道将audioinputstream输入到一个剪辑中,播放它就会播放完整的音频。 现在我的问题是:如何将完整的流写入一个文件,或者我是否必须这样做,这是一种更简单的方法,可以将wav文件下载到特定的位置

  • 现象: 运行 php start.php stop 提示 stop fail 原因:两种可能性 第一种可能性: 前提是以debug方式启动的workerman,开发者在终端按了ctrl z给workerman发送了SIGSTOP信号,导致workerman进入后台并挂起(暂停),所以无法响应stop命令(SIGINT信号)。 解决: 在启动workerman的终端输入fg(发送SIGCONT信号)

  • 问题内容: 在我们的Jenkins Pipeline工作中,我们有两个阶段,我想要的是,如果其中任何一个阶段失败,那么停止构建,而不继续进行下一个阶段。 这是其中一个阶段的示例: 该脚本将失败,并且生成结果将更新,但是作业将继续进行到下一个阶段。发生这种情况时,我该如何中止或停止工作? 问题答案: 基本上,这就是该步骤的作用。如果不将结果捕获到变量中,则可以运行: 如果脚本生成非零的退出代码,则将

  • 我正在制作一个简单的页面,您可以扫描或键入一个UPC,它会自动添加到一个表中以供显示。我放弃了一些代码来启动一个计时器,它在键入完成后等待3秒,然后在我的表中创建一个新行来显示键入的UPC和项目信息。 但是,这段代码有一些问题。(我的问题) a.)当您手动输入UPC时,新行操作会发生多次(为同一UPC插入多行),但当您使用条形码扫描器扫描UPC时,它只完成一次操作。(这是正确的) b)当您从字段中

  • 参考 workerman手册 http://doc3.workerman.net/install/start-and-stop.html