微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重塑使用 timeseries_dataset_from_array 预处理的 Tensorflow 数据集

如何解决重塑使用 timeseries_dataset_from_array 预处理的 Tensorflow 数据集

注意:我已经阅读了How to reshape BatchDataset class tensor?,但该解决方案不适用于此处。

Train a neural network with input as sliding windows of a matrix with Tensorflow / Keras,and memory issues 中所述,我需要从形状为 (10000,2000) 的矩阵中训练一个具有所有形状为 (16,2000) 的滑动窗口的神经网络。 (在我的另一篇文章中是 100k,但这里 10k 是可以的)。

import tensorflow
import numpy as np
X = np.array(range(20000000)).reshape(10000,2000)  
X = tensorflow.keras.preprocessing.timeseries_dataset_from_array(X,None,16,sequence_stride=1,sampling_rate=1,batch_size=32)
for b in X:
    print(b)  # Tensor of shape (32,2000)
    break

问题是我需要将它输入到一个需要 (...,2000,1) 形状的模型中。

model = Sequential()
model.add(Conv2D(16,kernel_size=(9,9),activation='relu',input_shape=(16,1),padding='same'))
...
model.fit(X,Y,epochs=8)

我试过了

X = tensorflow.reshape(X,(-1,1))

没有成功。

如何做到这一点,即具有形状为 timeseries_dataset_from_array(...,1)输出

解决方法

要将转换应用于 tf.data.Dataset 的每个元素,您应该使用 tf.data.Dataset.map function。在您的情况下,您可以使用 lambda 定义函数,使用 tf.expand_dims:

ds = tensorflow.keras.preprocessing.timeseries_dataset_from_array(X,None,16,sequence_stride=1,sampling_rate=1,batch_size=32)
ds_correct_shape = ds.map(lambda x: tf.expand_dims(x,axis=-1))

如果我们检查第一个元素的形状:

>>> for elem in ds_correct_shape.take(1):
        print(f"{elem.shape=}")
elem.shape=TensorShape([32,2000,1])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。