Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow tf.keras中的早期顶起问题_Tensorflow_Keras_Early Stopping - Fatal编程技术网

Tensorflow tf.keras中的早期顶起问题

Tensorflow tf.keras中的早期顶起问题,tensorflow,keras,early-stopping,Tensorflow,Keras,Early Stopping,我正在训练我的第一个转移学习模型(耶!),我很难让模型停止训练,因为验证损失在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',

我正在训练我的第一个转移学习模型(耶!),我很难让模型停止训练,因为验证损失在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损失
  • 我可以做更复杂的提前终止回调吗?类似于“如果val_精度>0.90&&val_损失在三个时期内没有超过0.1的变化”。如果可以,我可以得到一个教程的链接吗
减少
耐心=3
,减少e。g
1
2
并查看发生了什么


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


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

它不起作用,因为您将
回调
参数放在了错误的方法调用中。(事实上,当使用传递给
compile
callbacks
拟合模型时,我收到了一个无效的参数错误。因此,我不确定为什么您的模型编译时没有问题。)

它应该在
fit
方法中,如下所示。请注意,建议在早期停止配置中设置
verbose=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)

关于第二个问题,自定义回调是可能的,您可以参考文档中的示例。基本上,您需要在\u epoch\u end上的
中定义早期停止逻辑


另一方面,我认为您不应该过早地停止使用多个指标,选择一个重要的指标(即您正在优化的指标-
val\u accurity
),然后监控它。甚至还有一些源不鼓励提前停止&相反,将epoch视为一个可调的超参数。请参阅我发现有用的讨论主题。

也许可以解释一下原因!它告诉Keras你有多努力。耐心=少数人会告诉Keras尽早停止训练。另一方面,如果你使用一个大的数字,它会告诉Keras等待,直到达到相当大的准确度。耐心:产生监测数量且没有改善的历元数,之后将停止训练。如果验证频率(model.fit(Validation_freq=5))大于1,则可能不会为每个历元生成验证数量。我认为您只需编辑答案以包含这些详细信息,因为注释是临时的。谢谢,我也不确定模型为什么符合要求。谢谢你的链接。