关于Tensorflow中使用时Dense+LSTM时的tf.data.Dataset中batch_size的设计和LSTM中return_sequence的设置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在使用Tensorflow框架进行时间序列预测时遇到了模型输入尺寸以及batch_size相关的设置问题和LSTM网络中return_sequence的设置


一、问题描述

搭建一个简单的Dense+LSTM的时间序列预测模型,模型的输入是想用七天的历史数据对于未来一天的历史数据进行预测,其中时间间隔是15min。

因为我们想要借助的是LSTM的时间推理能力,所以我们的一个样本就是7*96 而不是1*672,对于tensorflow来说,模型的输入应该是(None,7,96),输出应该是(None,1,96),其中None指的是每次训练样本输入的批大小,由于本文使用的是tf.data.Dataset构建数据库,这与之前版本的TF并不一样

在本次实验中,遇到两个问题:

1. 训练时batch_size的设置问题,即mode.fit()函数设置失效
2. LSTM层中的return_sequences设置问题

二、模型准备

2.1 数据集准备

本文使用tf.data.Dataset构造数据集,而非使用传统的Numpy构造数据集,事实上tf.data.Dataset也是目前Tensorflow所推荐的方式。

dataset = tf.data.Dataset.from_tensor_slices((inputDataset,labelDataset))

这里不多赘述,其中inputDataset,labelDataset分别是输入和输出,格式都是Numpy,尺寸分别为(702, 7, 96)(702, 1, 96), 其中702是样本数。

构造出来的dataset如下

<_TensorSliceDataset element_spec=(TensorSpec(shape=(7, 96), dtype=tf.float64, name=None), TensorSpec(shape=(1, 96), dtype=tf.float64, name=None))>

2.2 模型构建

model = tf.keras.models.Sequential()
model.add(Dense(units=48,activation='tanh',input_shape=(7,96,)))  
model.add(LSTM(48,return_sequences=False))
model.add(Dense(96,activation='tanh'))
model.compile(loss='mae', optimizer='adam')

这里就是一个很简单的Dense + LSTM + Dense的结构,注意LSTM的输入必须三维的,其中第一维是batch_size,第二维我个人理解是时间步长,因为我用七天的数据,步长为一天,所以在这里就是7,第三维是你每一个时间步的输入,也就是96(当然由于前面用了一个Dense层进行降维,所以设置为48)。

三、问题一:batch_size问题

由于我之前用的tensorflow v1版本,所以当时采用的模型构建方式是model.fit(),并且数据集也是自己构建的Numpy格式,并没用使用Dataset格式。
代码如下:

model.fit(trainX, trainY, epochs=20, batch_size=50)
</
split = 90 def get_window_set(window_size, X_train, labels): X, y = [], [] for i in range(len(X_train) - window_size): X.append(X_train.iloc[i: i + window_size, : ].values) y.append(labels.iloc[i + window_size]) return np.array(X), np.array(y) def create_dataset(X, y, batch_size = 32): data = tf.data.Dataset.from_tensor_slices((X, y)) data = data.shuffle(buffer_size = len(X)) data = data.batch(batch_size = batch_size) return data def train_LSTM(X_train, labels): X_train = X_train[labels.notnull()].reset_index() labels = labels[labels.notnull()].reset_index() window_set_x, window_set_y = get_window_set(window_size = 60, X_train = X_train, labels = labels) train_x = window_set_x[:len(window_set_x) - split] train_y = window_set_y[:len(window_set_x) - split] val_x = window_set_x[len(window_set_x) - split: ] val_y = window_set_y[len(window_set_y) - split: ] dataset = create_dataset(train_x, train_y) model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape = (60, 552)), tf.keras.layers.LSTM(32, return_sequences = True), tf.keras.layers.LSTM(20, return_sequences = False), tf.keras.layers.Dense(1) ]) model.compile(loss = 'mse', optimizer = tf.keras.optimizers.SGD(learning_rate=1e-5, momentum=0.9)) model.fit(dataset, epochs = 5) val_y_pred = model.predict(val_x).flatten() val_y = pd.Series(val_y) val_y_pred = pd.Series(val_y_pred) val_y_pred = val_y_pred[val_y.notnull()] val_y = val_y[val_y.notnull()] print(val_y) print(val_y_pred) print(f'mse on val set is: {mean_squared_error(val_y, val_y_pred, squared=True)}') 纠正代码
最新发布
07-29
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值