我想使用Tensorboard来绘制给定时间范围内(x轴,例如5分钟)每轮迭代的均方误差(y轴)。
然而,我只能在每轮epoch结束时绘制MSE,并在5分钟时设置一个回调。这并不能解决我的问题。
我尝试在网上寻找一些解决方案,看看是否可以设置最大迭代次数而不是epoch数来进行model.fit,但没有找到合适的。我知道迭代次数是完成一个epoch所需的批次数,但因为我想调整batch_size,我更倾向于使用迭代次数。
我的代码目前如下所示:
input_size = len(train_dataset.keys())output_size = 10hidden_layer_size = 250n_epochs = 3weights_initializer = keras.initializers.GlorotUniform()#一个训练和验证模型并返回MSE的函数def train_val_model(run_dir, hparams): model = keras.models.Sequential([ #作为网络入口点的层 keras.layers.InputLayer(input_shape=[len(train_dataset.keys())]), #Dense层1 keras.layers.Dense(hidden_layer_size, activation='relu', kernel_initializer = weights_initializer, name='Layer_1'), #Dense层2 keras.layers.Dense(hidden_layer_size, activation='relu', kernel_initializer = weights_initializer, name='Layer_2'), #由于我们进行的是回归,激活函数为线性 keras.layers.Dense(output_size, activation='linear', name='Output_layer') ]) #使用随机梯度下降优化器,但通过改变batch_size来获得BSG、SGD或MiniSGD optimizer = tf.keras.optimizers.SGD(learning_rate=0.001, momentum=0.0, nesterov=False) #编译模型 model.compile(optimizer=optimizer, loss='mean_squared_error', #计算标签和预测值之间误差的平方均值 metrics=['mean_squared_error']) #计算y_true和y_pred之间的均方误差 #初始化TimeStopping回调 time_stopping_callback = tfa.callbacks.TimeStopping(seconds=5*60, verbose=1) #训练网络 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
结果如下:
期望的输出应该如下所示:
回答:
答案实际上相当简单。
tf.keras.callbacks.TensorBoard有一个update_freq参数,允许你控制何时将损失和指标写入tensorboard。标准设置是epoch,但你可以将其更改为batch,或者如果想每n个批次写入tensorboard一次,可以设置为整数。更多信息请查看文档:https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/TensorBoard