首页 > 解决方案 > 如何使用批量训练的 Tensorflow 预测模型进行单次预测?

问题描述

我正在尝试在 Tensorflow 中训练一个用于单变量时间序列预测的模型。首先,我tf.data.Dataset使用 10 个窗口从数据帧创建一个,其中每个窗口中的最后一个值是要预测的地面真值。然后,我分别使用 70%/15%/15% 的比例将数据集打乱并拆分为训练/验证/测试数据集。我以 32 的批大小对训练集和验证集进行批处理。

df = pd.read_csv('MY.csv', index_col=0, parse_dates=True)
#extract the column we are interested in
single_col = df[['Close']]

#Convert to TFDataset
WINDOW_SIZE = 10
dataset = tf.data.Dataset.from_tensor_slices((single_col_df.values))
d = dataset.window(WINDOW_SIZE, shift=1, drop_remainder=True)
d2 = d.flat_map(lambda window: window.batch(WINDOW_SIZE+1))
#create data and ground truth
d3 = d2.map(lambda window: (window[:-1], window[-1:]))

#get the total data and shuffle
len_ds = 0
for item in d2:
  len_ds +=1
d_shuffled = d3.shuffle(buffer_size=len_ds)

# split train/test
train_size = int(0.7 * len_ds)
val_size = int(0.15 * len_ds)    
test_size = int(0.15 * len_ds)
train_dataset = d_shuffled.take(train_size)
test_dataset = d_shuffled.skip(train_size)
val_dataset = test_dataset.skip(test_size)
test_dataset = test_dataset.take(test_size)
train_dataset = train_dataset.batch(32).prefetch(2)
val_dataset = val_dataset.batch(32)

现在我定义、编译和训练模型。我假设input_shape第一个 GRU 层的 应该是[WINDOW_SIZE, 1],即用于新预测的过去样本的数量和 $1$,因为它是一个单变量模型。

# DEFINE THE MODEL ARCHITECTURE
MODEL_ARCH = [
  tf.keras.layers.GRU(32, return_sequences=True, input_shape=[WINDOW_SIZE, 1]),
  tf.keras.layers.GRU(32,),
  tf.keras.layers.Dense(10, activation='tanh'),
  tf.keras.layers.Dense(1, activation='tanh'),
  tf.keras.layers.Lambda(lambda x: x*100)

]

# TRAIN THE MODEL
model = tf.keras.models.Sequential(MODEL_ARCH)

optimizer = tf.keras.optimizers.Adagrad(lr=1e-3)
model.compile(loss='mse', optimizer=optimizer) #accuracy is a categorical metric: don't use it

history = model.fit(train_dataset, epochs=100, validation_data=val_dataset)

评估或预测模型时会出现问题:我想评估/预测单个值而不是批次。运行model.evaluate(test_dataset)返回错误,我认为是因为训练是在 32 的批次上进行的,但test_data还没有被批处理。为此,我不得不这样做:

model.evaluate(test_data.batch(1), batch_size=1)

但这每次运行都会返回不同的结果。我认为的问题是,在使用给定的浴缸尺寸训练模型之后,我不能将它用于单一预测。我还尝试按照其他帖子的建议重新定义模型并复制权重,但没有解决。问题可能还涉及我为第一层设置的输入形状,即[WINDOW_SIZE, 1]因为。

可选提示

有没有人有更好的方法来找出tf.data.Dataset结构的长度,而不是像我一样循环遍历它的元素?

标签: pythontensorflowmachine-learningtime-seriesforecasting

解决方案


推荐阅读