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

早顶张流2.0

袁翰池
2023-03-14

我正在运行一个使用Python 3.7的代码。5使用TensorFlow 2.0进行MNIST分类。我使用的是TensorFlow 2.0中的EarlyStating,我对它的回调是:

callbacks = [
             tf.keras.callbacks.EarlyStopping(
                 monitor='val_loss', patience = 3,
                 min_delta=0.001
             )
]

根据Earlystoping-TensorFlow 2.0页面,min_delta参数的定义如下:

最小增量:被监测数量的最小变化被视为改进,即小于最小增量的绝对变化将被视为无改进。

培训60000个样本,验证10000个样本

纪元1/15 60000/60000 [==============================] - 10s 173us/样品-损失: 0.2040-精度: 0.9391-val_loss: 0.1117-val_accuracy: 0.9648

纪元2/15 60000/60000 [==============================] - 9s 150us/样品-损耗: 0.0845-精度: 0.9736-val_loss: 0.0801-val_accuracy: 0.9748

纪元3/15 60000/60000 [==============================] - 9s 151us/样品-损失: 0.0574-精度: 0.9817-val_loss: 0.0709-val_accuracy: 0.9795

纪元4/15 60000/60000[===================================================-9S149US/样本-损失:0.0434-精度:0.9858-val_损失:0.0787-val_精度:0.9761

纪元5/15 60000/60000 [==============================] - 9s 151us/样品-损失: 0.0331-精度: 0.9893-val_loss: 0.0644-val_accuracy: 0.9808

纪元6/15 60000/60000 [==============================] - 9s 150us/样品-损失: 0.0275-精度: 0.9910-val_loss: 0.0873-val_accuracy: 0.9779

纪元7/15 60000/60000 [==============================] - 9s 151us/样品-损失: 0.0232-精度: 0.9921-val_loss: 0.0746-val_accuracy: 0.9805

纪元8/15 60000/60000[============================================================-9s 151us/样本-损失:0.0188-精度:0.9936-val_损失:0.1088-val_精度:0.9748

现在,如果我看看最后三个时代,即。,第6、7和8阶段,看看验证损失(“val_损失”),它们的值是:

0.0688、0.0843和0.0847。

连续3个术语之间的差值为:0.0155,0.0004。但第一个差异是否大于回调中定义的“min_delta”。

我想出的EarlyStop代码如下:

# numpy array to hold last 'patience = 3' values-
pv = [0.0688, 0.0843, 0.0847]

# numpy array to compute differences between consecutive elements in 'pv'-
differences = np.diff(pv, n=1)

differences
# array([0.0155, 0.0004])


# minimum change required for monitored metric's improvement-
min_delta = 0.001

# Check whether the consecutive differences is greater than 'min_delta' parameter-
check = differences > min_delta

check
# array([ True,  False])

# Condition to see whether all 3 'val_loss' differences are less than 'min_delta'
# for training to stop since EarlyStopping is called-
if np.all(check == False):
    print("Stop Training - EarlyStopping is called")
    # stop training 

但根据“val_损失”,并非所有最后三个时期之间的差异都大于0.001的“min_delta”。例如,第一个差值大于0.001(0.0843-0.0688),而第二个差值小于0.001(0.0847-0.0843)。

此外,根据"EarlyStop"的耐心参数定义:

耐心:没有改善的时期数,之后将停止训练。

因此,当val_loss连续3个纪元没有改善时,如果绝对变化小于min_delta,则不算作改善,则应称为早期停止。

那为什么叫早期停止?

模型定义和“fit()”的代码为:

import tensorflow_model_optimization as tfmot 
from tensorflow_model_optimization.sparsity import keras as sparsity 
import matplotlib.pyplot as plt from tensorflow.keras.layers import AveragePooling2D, Conv2D
from tensorflow.keras import models, layers, datasets 
from tensorflow.keras.layers import Dense, Flatten, Reshape, Input, InputLayer 
from tensorflow.keras.models import Sequential, Model

# Specify the parameters to be used for layer-wise pruning, NO PRUNING is done here: 
pruning_params_unpruned = {
    'pruning_schedule': sparsity.PolynomialDecay(
        initial_sparsity=0.0, final_sparsity=0.0,
        begin_step = 0, end_step=0, frequency=100) }


def pruned_nn(pruning_params):
    """
    Function to define the architecture of a neural network model
    following 300 100 architecture for MNIST dataset and using
    provided parameter which are used to prune the model.

    Input: 'pruning_params' Python 3 dictionary containing parameters which are used for pruning
    Output: Returns designed and compiled neural network model
    """

    pruned_model = Sequential()
    pruned_model.add(l.InputLayer(input_shape=(784, )))
    pruned_model.add(Flatten())
    pruned_model.add(sparsity.prune_low_magnitude(
        Dense(units = 300, activation='relu', kernel_initializer=tf.initializers.GlorotUniform()),
        **pruning_params))
    # pruned_model.add(l.Dropout(0.2))
    pruned_model.add(sparsity.prune_low_magnitude(
        Dense(units = 100, activation='relu', kernel_initializer=tf.initializers.GlorotUniform()),
        **pruning_params))
    # pruned_model.add(l.Dropout(0.1))
    pruned_model.add(sparsity.prune_low_magnitude(
        Dense(units = num_classes, activation='softmax'),
        **pruning_params))

    # Compile pruned CNN-
    pruned_model.compile(
        loss=tf.keras.losses.categorical_crossentropy,
        # optimizer='adam',
        optimizer=tf.keras.optimizers.Adam(lr = 0.001),
        metrics=['accuracy'])

    return pruned_model


batch_size = 32
epochs = 50



# Instantiate NN- 
orig_model = pruned_nn(pruning_params_unpruned)


# Train unpruned Neural Network-
history_orig = orig_model.fit(
    x = X_train, y = y_train,
    batch_size = batch_size,
    epochs = epochs,
    verbose = 1,
    callbacks = callbacks,
    validation_data = (X_test, y_test),
    shuffle = True )

共有1个答案

罗凯
2023-03-14

提前停止回调的行为与以下方面有关:

  • 待监控的度量或损失
  • min_delta这是在当前纪元中监控数量的性能和该度量中的最佳结果之间被视为改进的最小数量
  • patience这是停止算法之前,没有改进的时代数(考虑到改进的变化必须大于min_delta

在您的情况下,最好的val_loss0.0644,并且应该具有低于0.0634的值来注册为改进:

Epoch 6/15 val_loss: 0.0873 | Difference is: + 0.0229
Epoch 7/15 val_loss: 0.0746 | Difference is: + 0.0102
Epoch 8/15 val_loss: 0.1088 | Difference is: + 0.0444

请注意,“培训日志”中打印的数量是近似值,您不应基于这些值进行假设。您更应该考虑回调或培训历史的真实值。

参考

 类似资料:
  • 我试图在张量流图中使用条件随机场损失。 我正在执行序列标记任务: 我有一系列元素作为输入。每个元素可以属于三个不同类中的一个。类以一种热编码方式表示:属于类0的元素由向量[表示。 我的输入标签(y)有大小(xx)。 我的网络产生相同形状的日志。 假设我所有的序列都有长度4。 这是我的代码: 我得到以下错误: 文件“/usr/local/lib/python2.7/dist-packages/ten

  • 当我试图连接到MongoDB Atlas免费层时,我得到了一个过早到达流结束的错误。使用Java1.8和Mongo驱动程序3.8.0。这和Atlas中的集群设置有什么关系吗?我在MongoDB本地主机上使用了相同的程序。 错误:

  • 我下面的代码产生了常规的tensorflow模型,但当我试图将其转换为tensorflow lite时,它不起作用,我遵循了以下文档。 https://www.tensorflow.org/tutorials/estimator/linear1 https://www.tensorflow.org/lite/guide/get_started 错误信息 文档摘录 TensorFlow Lite转换

  • 我有这个代码,用于使用tenorflow hub的预训练通用编码器构建语义搜索引擎。我无法转换为tlite。我已将模型保存到我的目录中。 导入模型: 根据数据训练模型: 保存模型: 保存工作正常,但当我转换到tflite它给出错误。 转换码: 错误:

  • 我正在努力把我的模型放在Android Studio。为了在Android studio中使用我的模型,我还知道需要将libandroid_tensorflow_inference_java.jar和libtensorflow_inference.so文件放入Android studio的资产文件夹中。因此,我使用git下载tensorflow库,并使用它构建。So和。jar文件。在创建。so文件

  • 我试图解密和验证一个加密的文件,但得到一个异常java。伊奥。EOFEException:执行完整性检查时,PartialInputStream中的流过早结束。数据被正确解密,签名被检查。 异常发生在pbe中。验证()。 有人知道为什么会发生这种情况,以及如何解决它吗? 我在1.51版上使用JDK15。 代码如下: 完整的堆栈跟踪: