计算每次迭代和时间张量流的损失(MSE)

2024-05-19 15:53:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我的代码当前如下所示:

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

导致:

x-axis: epochs, y-axis: MSE

所需的输出应如下所示:

x-axis: minutes, y-axis: MSE


Tags: andthelayersizemodellayersbatchtrain
2条回答

你不能每次迭代都这么做的原因是损失是在每个历元结束时计算出来的。如果要调整批大小,请运行设置数量的历元并进行评估。从16开始,加入2的幂,看看你能把你的网络的幂提高多少。但是,通常说更大的批量可以提高性能,但仅仅关注它并没有那么重要。首先关注网络中的其他事情

答案其实很简单

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

相关问题 更多 >