【问题标题】:Computing the loss (MSE) for every iteration and time Tensorflow计算每次迭代和时间的损失(MSE)Tensorflow
【发布时间】:2020-11-18 08:38:40
【问题描述】:

我想使用 Tensorboard 绘制给定时间范围(x 轴)内每次迭代的均方误差(y 轴),比如 5 分钟。

但是,我只能绘制给定每个时期的 MSE,并在 5 分钟时设置回调。然而,这并不能解决我的问题。

我尝试在互联网上寻找一些解决方案,以了解如何在执行 model.fit 时设置最大迭代次数而不是 epoch,但没有运气。我知道迭代是完成一个 epoch 所需的批次数,但由于我想调整 batch_size,我更喜欢使用迭代。

我的代码目前如下所示:

input_size = len(train_dataset.keys())
output_size = 10
hidden_layer_size = 250
n_epochs = 3

weights_initializer = keras.initializers.GlorotUniform()

#A function that trains and validates the model and returns the MSE
def train_val_model(run_dir, hparams):
    model = keras.models.Sequential([
            #Layer to be used as an entry point into a Network
            keras.layers.InputLayer(input_shape=[len(train_dataset.keys())]),
            #Dense layer 1
            keras.layers.Dense(hidden_layer_size, activation='relu', 
                               kernel_initializer = weights_initializer,
                               name='Layer_1'),
            #Dense layer 2
            keras.layers.Dense(hidden_layer_size, activation='relu', 
                               kernel_initializer = weights_initializer,
                               name='Layer_2'),
            #activation function is linear since we are doing regression
            keras.layers.Dense(output_size, activation='linear', name='Output_layer')
                                ])
    
    #Use the stochastic gradient descent optimizer but change batch_size to get BSG, SGD or MiniSGD
    optimizer = tf.keras.optimizers.SGD(learning_rate=0.001, momentum=0.0,
                                        nesterov=False)
    
    #Compiling the model
    model.compile(optimizer=optimizer, 
                  loss='mean_squared_error', #Computes the mean of squares of errors between labels and predictions
                  metrics=['mean_squared_error']) #Computes the mean squared error between y_true and y_pred
    
    # initialize TimeStopping callback 
    time_stopping_callback = tfa.callbacks.TimeStopping(seconds=5*60, verbose=1)
    
    #Training the network
    history = model.fit(normed_train_data, train_labels, 
         epochs=n_epochs,
         batch_size=hparams['batch_size'], 
         verbose=1,
         #validation_split=0.2,
         callbacks=[tf.keras.callbacks.TensorBoard(run_dir + "/Keras"), time_stopping_callback])
    
    return history

#train_val_model("logs/sample", {'batch_size': len(normed_train_data)})
train_val_model("logs/sample1", {'batch_size': 1})
%tensorboard --logdir_spec=BSG:logs/sample,SGD:logs/sample1

导致:

所需的输出应如下所示:

【问题讨论】:

    标签: python tensorflow machine-learning neural-network tensorboard


    【解决方案1】:

    您不能每次迭代都这样做的原因是损失是在每个 epoch 结束时计算的。如果要调整批量大小,请运行一定数量的 epoch 并进行评估。从 16 开始,使用 2 的幂,看看你能在多大程度上提升你的网络的力量。但是,通常说更大的批量大小可以提高性能,但仅仅关注它并没有那么重要。首先关注网络中的其他事情。

    【讨论】:

    • 在想要这样的形状之前至少运行 20 个 epoch。这种形状是在经过大量时期之后出现的。
    • 问题是我想直观地比较两种梯度下降。每个 epoch 进行随机梯度下降的时间太长,所以如果有一种方法可以显示步数或迭代次数而不是 epoch,这将使不同类型的梯度下降更具可比性。
    • 不同类型的梯度下降算法会产生不同的训练损失和验证损失曲线。好的算法收敛速度快,坏的算法需要时间。关于神经网络的算法的优点在于收敛速度更快。这就是为什么对 Adam 优化器如此热爱的原因。
    • 计算时间的差异是因为它们的方程。您可以为此进行时间复杂度分析。如果你想追求它,一个想法是使用详细标志,增加详细程度。但是,到那时,您将达到最高级别。
    • 您可以使用 GradientTape 使用训练循环并控制训练过程,这很困难,这将实现您的目标。
    【解决方案2】:

    答案其实很简单。

    tf.keras.callbacks.TensorBoard 有一个 update_freq 参数,允许您控制何时将损失和指标写入 tensorboard。标准是 epoch,但如果您想每 n 个批次写入 tensorboard,您可以将其更改为批次或整数。有关详细信息,请参阅文档:https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/TensorBoard

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2019-05-31
      • 2016-05-21
      • 2016-07-13
      • 2019-06-20
      相关资源
      最近更新 更多