![](/img/trans.png)
[英]Keras functional api: Input is incompatible with the layer with conv1d
[英]Input Layer for Conv1D in Keras
让我稍微解释一下我的问题和数据集。 在我的数据集中,我每小时测量一个变量x
和另外 7 列代表该测量被视为虚拟变量的星期几。 所以,它是这样的:
DateTime x Mon Tue Wed Thur Fri Sat Sun
2017/01/01 00:00 10 0 0 0 0 0 0 1
2017/01/01 01:00 15 0 0 0 0 0 0 1
2017/01/01 02:00 21 0 0 0 0 0 0 1
...
2017/01/01 23:00 32 0 0 0 0 0 0 1
2017/01/02 00:00 17 1 0 0 0 0 0 0
2017/01/02 01:00 19 1 0 0 0 0 0 0
2017/01/02 02:00 48 0 0 0 0 0 0 1
...
2022/08/15 00:00 43 0 0 0 0 0 0 1
该数据集的形状为(49249, 8)
。
我使用 2017~2021 年的数据进行训练,只有 2022 年用于测试。
使用两天的数据( 48 rows
),我需要在第二天预测x
。 在将此数据集更改为看起来像监督学习后,我得到了一个形状为(1842, 55)
的新训练数据集。 55
是因为我使用了两天的数据( 24+24
)加上代表我要进行预测的那一天的虚拟变量( 7
变量) 24+24+7 = 55
。
现在,根据Keras 文档, InputShape
层的Conv1D
应该具有(batch_size, steps, input_dim)
的形状。
所以我做了以下事情:
max_batch_size = 1824
steps = 48
input_dim = 55
所以,我试图重塑它:
dataset = dataset.reshape(max_batch_size, steps, input_dim)
我得到了这个错误:
ValueError: cannot reshape array of size 100320 into shape (1824,48,55)
我知道这已经被问了很多,但我仍然不明白,我在这里看到的答案都没有对我有用。 我应该如何设置我的InputLayer
以与Conv1D
层一起使用?
在这种情况下,您正在尝试解决序列问题,所以如果我做到了,您只需要 output 值,列出作为输出的值,然后按
dataset = tf.data.Dataset.from_tensor_slices(list_of_values)
取值列表,您说您需要两天时间来预测第二天; 因此,基于此,您应该将上述 function 的 output 与 window 大小为两天和一天,然后预测第二天的 48 值的 4 个值。 那么那么;
data = data.window(window_size = 48 + 24, drop_remainder = True)
#set drop_remainder to true to drop sequences that are not in the same length as the others
扁平 map 和随机数据如下
data = data.flat_map(lambda window : window.batch(48+24))
data = data.shuffle(shuffle_buffer)
现在您应该使用 map 数据来分离输入和输出,如下所示
data = data.map(window : (window[:48], window[48:])
#by this way you set window size 48 values as the input and the others 24 values as the outputs (forecast)
现在设置它的批量大小
data = data.batch(batch_size).prefetch()
现在您在窗口数据集中的数据可以输入到卷积一维中,对于输入层有两种方法; 您可以将输入形状设置为 (48,),然后使用 lambda 定义 lambda 层,该层重塑或扩展尺寸,甚至将输入形状设置为等于 (48,1),然后将其馈入 Conv1D 层
注意在您的情况下,通过这种方式,model 将获得 48 个任何格式的值,我的意思是从一天中的每个时间开始,但是如果您的 model 将从特定时间(例如上午 12 点)获取其输入,因此它需要定义在 window function 中的shift
参数并将其设置为 24 以从上午 12 点开始每天取某些 24 个值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.