【发布时间】:2019-12-24 18:42:32
【问题描述】:
喏,
这是我在使用 CNN 1d 时遇到的问题的第二部分。第一部分是这个
How does it works the input_shape variable in Conv1d in Keras?
我正在使用此代码:
from keras.models import Sequential
from keras.layers import Dense, Conv1D
import numpy as np
N_FEATURES=5
N_TIMESTEPS=10
X = np.random.rand(100, N_FEATURES)
Y = np.random.randint(0,2, size=100)
model = Sequential()
model.add(Conv1D(filters=32, kernel_size=N_TIMESTEPS, activation='relu', input_shape=(N_TIMESTEPS, N_FEATURES)))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
现在,我想做什么?
我想在具有 5 个特征的时间序列上训练 CNN 1d。实际上我想使用时间窗口 og 长度 N_TIMESTEPS 而不是它自己的时间序列。这意味着我想在时间序列上使用一种维度为 N_TIMESTEPS x N_FEATURES 的“放大镜”在本地工作。这就是我决定使用 CNN 的原因
第一个问题来了。完全不清楚我是否必须将时间序列转换为张量,或者这是 Keras 将为我做的事情,因为我已经指定了 kernel_size 变量。
如果我必须提供张量,我会这样做:
X_tensor = []
for i in range(len(X)-N_TIMESTEPS):
X_tensor+=[X_tensor[range(i, N_TIMESTEPS+i), :]]
X_tensor = np.asarray(X_tensor)
当然,在这种情况下,我还应该提供一个根据某些标准从 Y 计算得到的 Y_tensor 向量。假设我已经有了这个 X_tensor 长度相同的 Y_tensor 布尔向量,即 len(X)-N_TIMESTEPS-1。
Y_tensor = np.random.randint(0,2,len(X)-N_TIMESTEPS-1)
现在,如果我尝试输入模型,我会得到 CNN 1d 最常见的错误:
ValueError: Error when checking input: expected conv1d_4_input to have 3 dimensions, but got array with shape (100, 5)
通过查看十几篇关于它的帖子,我无法理解我做错了什么。这是我尝试过的:
model.fit(X,Y)
model.fit(np.expand_dims(X, axis=0),Y)
model.fit(np.expand_dims(X, axis=2),Y)
model.fit(X_tensor,Y_tensor)
对于所有这些情况,我总是得到相同的错误(最终元组中的维度值不同)。
问题:
Keras 对我的数据有什么期望?我可以为模型提供整个时间序列,还是必须将其切成张量?
我必须如何根据数据结构为模型提供数据?即我必须以某种奇怪的方式指定数据的维度?
你能帮帮我吗?我发现这是在 Keras 中实现 CNN 的最令人困惑的一点之一,即不同的帖子具有不同的解决方案,不符合我的数据结构(即使它们在我看来具有非常常见的结构)。
注意:有一些帖子建议在 input_shape 变量中传递数据的长度。这对我来说毫无意义,因为我不应该向模型提供数据的维度(它是一个变量)。根据理论,我唯一应该给它的是过滤器维度和特征数量(即将翻转时间序列的矩阵的维度)。
谢谢,
上午
【问题讨论】:
标签: python tensorflow keras deep-learning conv-neural-network