我正在尝试对10个序列、每个序列包含5个特征的多变量时间序列数据应用因果卷积神经网络模型。
lookback, features = 10, 5
过滤器和内核应该设为什么?
- 过滤器和内核对网络有什么影响?
- 它们只是任意的数字吗,比如ANN层中的神经元数量?
- 还是它们会影响网络解释时间步的方式?
扩张率应该设为什么?
- 这只是任意的数字吗,还是表示模型的回溯?
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
后,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个滤波器)
- 为什么最初它们是独立应用的?
- 为什么现在它们是依赖应用的?
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个回顾的值是多少?
为什么因果层最初是独立应用的?
- 为什么在改变形状后它们被依赖地应用?
- 为什么不从一开始就依赖地应用它们?
===========================================================================
完整代码
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()
编辑:
感谢你的问题,Daniel。
问题:
如果你能够“确切地”解释你的数据结构是如何构造的,原始数据是什么以及如何将其转换为输入形状、是否有独立的序列、是否创建滑动窗口等。这个过程的更好理解可以被实现。
答案:
我希望我正确理解了你的问题。
每个特征都是一系列时间序列数据的序列数组。它们是相互独立的,也就是说,它们不是一张图片,但是它们有某种程度上的相关性。
这就是为什么我尝试使用Wavenet,因为它非常擅长预测单个时间序列数组,然而我的问题需要我使用多个特征。