python - 如何使用批量训练的 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
结构的长度,而不是像我一样循环遍历它的元素?
解决方案
推荐阅读
- javascript - 将模态(来自表格)内的数据提取到 href
- caching - 为什么目录状态转换图不处理教科书上的写入命中事件
- r - R未来包 - 理解错误消息
- java - 当里面的值为null时如何配置ModelMapper不设置someClass = null(someClass是嵌套的)
- go - 如何在 go 包中运行测试 go 文件?
- ffmpeg - 使用 ffmpeg 将 h264 流附加到 m3u8 文件
- interrupt - AVR ATmega324A 中的中断
- git - git (GitHub) 在以前可以连接的 EC2 服务器上超时
- loops - 使用循环正确地将变量传递给任务
- ruby-on-rails - 规格/水豚中的无关