【发布时间】:2019-11-05 18:35:27
【问题描述】:
这个问题是我之前的问题的后续问题:Multi-feature causal CNN - Keras implementation,但是,我认为有很多事情不清楚,我认为需要提出一个新问题。这里有问题的模型是根据上面提到的帖子中接受的答案构建的。
我正在尝试对具有 5 个特征的 10 个序列的多元时间序列数据应用因果 CNN 模型。
lookback, features = 10, 5
-
过滤器和内核应该设置成什么?
- 过滤器和内核对网络有什么影响?
- 这些只是一个任意数字 - 即 ANN 层中的神经元数量吗?
- 或者它们会对网络如何解释时间步长产生影响?
-
扩张应该设置成什么?
- 这只是一个任意数字还是代表模型的
lookback?
- 这只是一个任意数字还是代表模型的
filters = 32
kernel = 5
dilations = 5
dilation_rates = [2 ** i for i in range(dilations)]
model = Sequential()
model.add(InputLayer(input_shape=(lookback, features)))
model.add(Reshape(target_shape=(features, lookback, 1), input_shape=(lookback, features)))
根据前面提到的答案,输入需要按照以下逻辑进行reshape:
- 在
Reshape之后,现在将 5 个输入要素视为 TimeDistributed 层的时间层 当Conv1D应用于每个输入特征时,它认为层的形状是(10, 1)
使用默认的“channels_last”,因此...
- 10 个时间步是时间维度
- 1 是“通道”,即特征图的新位置
# Add causal layers
for dilation_rate in dilation_rates:
model.add(TimeDistributed(Conv1D(filters=filters,
kernel_size=kernel,
padding='causal',
dilation_rate=dilation_rate,
activation='elu')))
根据上面提到的答案,模型需要重塑,按照以下逻辑:
- 将特征图堆叠在一起,这样每个时间步都可以查看之前生成的所有特征 -(10 个时间步,5 个特征 * 32 个过滤器)
接下来,因果层现在独立地应用于 5 个输入特征。
- 为什么最初是独立应用的?
- 为什么它们现在独立应用?
model.add(Reshape(target_shape=(lookback, features * filters)))
next_dilations = 3
dilation_rates = [2 ** i for i in range(next_dilations)]
for dilation_rate in dilation_rates:
model.add(Conv1D(filters=filters,
kernel_size=kernel,
padding='causal',
dilation_rate=dilation_rate,
activation='elu'))
model.add(MaxPool1D())
model.add(Flatten())
model.add(Dense(units=1, activation='linear'))
model.summary()
总结
-
过滤器和内核应该设置成什么?
- 它们会影响网络如何解释时间步长吗?
应该将扩张设置为什么来表示 10 的回溯?
为什么最初独立应用因果层?
-
reshape 后为什么要依赖应用?
- 为什么不从一开始就独立应用它们?
================================================ ==============================
完整代码
lookback, features = 10, 5
filters = 32
kernel = 5
dilations = 5
dilation_rates = [2 ** i for i in range(dilations)]
model = Sequential()
model.add(InputLayer(input_shape=(lookback, features)))
model.add(Reshape(target_shape=(features, lookback, 1), input_shape=(lookback, features)))
# Add causal layers
for dilation_rate in dilation_rates:
model.add(TimeDistributed(Conv1D(filters=filters,
kernel_size=kernel,
padding='causal',
dilation_rate=dilation_rate,
activation='elu')))
model.add(Reshape(target_shape=(lookback, features * filters)))
next_dilations = 3
dilation_rates = [2 ** i for i in range(next_dilations)]
for dilation_rate in dilation_rates:
model.add(Conv1D(filters=filters,
kernel_size=kernel,
padding='causal',
dilation_rate=dilation_rate,
activation='elu'))
model.add(MaxPool1D())
model.add(Flatten())
model.add(Dense(units=1, activation='linear'))
model.summary()
================================================ ==============================
编辑:
丹尼尔,谢谢你的回答。
问题:
如果您可以“准确”解释您是如何构建数据的、原始数据是什么以及如何将其转换为输入形状、如果您有独立的序列、如果您正在创建滑动windows等。可以更好地理解这个过程。
答案:
希望我能正确理解您的问题。
每个特征都是时间序列数据的序列数组。它们是独立的,因为它们不是图像,但是它们在某种程度上相互关联。
这就是我尝试使用 Wavenet 的原因,它非常擅长预测单个时间序列数组,但是,我的问题需要我使用多个多个特征。
【问题讨论】:
标签: python tensorflow keras time-series conv-neural-network