Tensorflow tf.data.Dataset无法正确执行每个时期的步骤

问题描述

steps_per_epoch中使用model.fit参数时遇到问题。据我所知,steps_per_epoch用于记录指标,例如损失函数,经过多次迭代后,即在将多个批次输入模型之后。因此,在训练期间,我们能够在几次迭代后看到损失,而不必等到纪元结束才显示损失。因此,就是说,如果我的数据很少,那么我的模型将仅从几个纪元学习一个模式。因此,我有兴趣看到n次迭代后模型的行为。

首先,请注意我有tensorflow版本2.3.0

这是数据预处理逻辑(这是为时间序列数据定制的。)

window_size = 42
batch_size  = 32
forecast_period = 3

def _sub_to_batch(sub):
    return sub.batch(window_size,drop_remainder=True)

def _return_input_output(tensor):
    _input  = tensor[:,:-forecast_period,:]
    _output = tensor[:,forecast_period:,:]
    return _input,_output

def _reshape_tensor(tensor):
    tensor = tf.expand_dims(tensor,axis=-1)
    tensor = tf.transpose(tensor,[1,2])
    return tensor

# total elements after unbatch(): 3813
train_ts_dataset = tf.data.Dataset.from_tensor_slices(train_ts)\
                            .window(window_size,shift=1)\
                            .flat_map(_sub_to_batch)\
                            .map(_reshape_tensor)\
                            .unbatch().shuffle(buffer_size=500).batch(batch_size)\
                            .map(_return_input_output)

valid_ts_dataset = tf.data.Dataset.from_tensor_slices(valid_ts)\
                            .window(window_size,shift=1)\
                            .flat_map(_sub_to_batch)\
                            .map(_reshape_tensor)\
                            .unbatch().shuffle(buffer_size=500).batch(batch_size)\
                            .map(_return_input_output)


for i,(x,y) in enumerate(train_ts_dataset):
    print(i,x.numpy().shape,y.numpy().shape)

输出:

0 (32,39,1) (32,1)
1 (32,1)
2 (32,1)
3 (32,1)
4 (32,1)
5 (32,1)
6 (32,1)
7 (32,1)
8 (32,1)
9 (32,1)
10 (32,1)
11 (32,1)
12 (32,1)
13 (32,1)
14 (32,1)
15 (32,1)
16 (32,1)
17 (32,1)
18 (32,1)
19 (32,1)
20 (32,1)
21 (32,1)
22 (32,1)
23 (32,1)
24 (32,1)
25 (32,1)
26 (29,1) (29,1)

因此,我可以说我的数据集总共包含27个批次,每个批次都包含29-32个形状为(32,39,1),(32,39,1)的元素。

关于型号:

import datetime

tf.keras.backend.clear_session()

time_steps = x_train.shape[1]

def _custom_mae(y_pred,y_true):
    _y_pred = y_pred[-forecast_period:,:]
    _y_true = y_true[-forecast_period:,:]
    mae = tf.losses.MAE(_y_true,_y_pred)
    return mae

model = k.models.Sequential([
#     k.layers.Bidirectional(k.layers.LSTM(units=100,return_sequences=True),input_shape=(None,1)),k.layers.Conv1D(256,16,strides=1,padding='same',k.layers.Conv1D(128,padding='same'),k.layers.TimeDistributed(k.layers.Dense(1))
])

_datetime = datetime.datetime.now().strftime("%Y%m%d-%H-%M-%S")
_log_dir = os.path.join(".","logs","fit4",_datetime)

tensorboard_cb = k.callbacks.TensorBoard(log_dir=_log_dir)

model.compile(loss="mae",optimizer=tf.optimizers.Adam(learning_rate=0.01),metrics=[_custom_mae])

#,validation_data=valid_ts_dataset
history = model.fit(train_ts_dataset,steps_per_epoch=12,epochs=1,callbacks=[tensorboard_cb])

我得到以下输出:

所以,我可以说我在一个真实纪元内有12个虚拟纪元。

enter image description here

但是,在研究history.history之后,我得到了以下信息:

enter image description here

但是,我希望看到loss_custom_mae的12个值的列表

最后,我想在张量板上查看结果。

请让我知道我所缺少的以及如何解决我的问题。

提前感谢您的支持!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)