在Keras实现的Wavenet中,输入形状为(None,1)。我有一个时间序列(val(t)),其中目标是在给定过去值窗口的情况下预测下一个数据点(窗口大小取决于最大膨胀)。 Wavenet中的输入形状很困惑。 我对此有一些问题:
- 当给出完整序列时,Keras如何确定输入维度(None)?根据膨胀,我们希望输入长度为2^8。
- 如果将形状为(1M,1)的输入序列作为训练X提供,是否需要生成2 ^ 8个时间步的向量作为输入? 似乎我们可以直接使用输入序列作为wavenet的输入(不确定为什么原始时间序列输入不会出现错误)。
- 通常情况下,我们如何调试这样的Keras网络。 我尝试在数值数据上应用函数,如Conv1D(16,1,padding ='same',activation ='relu')(inputs),但是它报错了。
#
n_filters = 32
filter_width = 2
dilation_rates = [2**i for i in range(7)] * 2
from keras.models import Model
from keras.layers import Input, Conv1D, Dense, Activation, Dropout, Lambda, Multiply, Add, Concatenate
from keras.optimizers import Adam
history_seq = Input(shape=(None, 1))
x = history_seq
skips = []
for dilation_rate in dilation_rates:
# preprocessing - equivalent to time-distributed dense
x = Conv1D(16, 1, padding='same', activation='relu')(x)
# filter
x_f = Conv1D(filters=n_filters,
kernel_size=filter_width,
padding='causal',
dilation_rate=dilation_rate)(x)
# gate
x_g = Conv1D(filters=n_filters,
kernel_size=filter_width,
padding='causal',
dilation_rate=dilation_rate)(x)
# combine filter and gating branches
z = Multiply()([Activation('tanh')(x_f),
Activation('sigmoid')(x_g)])
# postprocessing - equivalent to time-distributed dense
z = Conv1D(16, 1, padding='same', activation='relu')(z)
# residual connection
x = Add()([x, z])
# collect skip connections
skips.append(z)
# add all skip connection outputs
out = Activation('relu')(Add()(skips))
# final time-distributed dense layers
out = Conv1D(128, 1, padding='same')(out)
out = Activation('relu')(out)
out = Dropout(.2)(out)
out = Conv1D(1, 1, padding='same')(out)
# extract training target at end
def slice(x, seq_length):
return x[:,-seq_length:,:]
pred_seq_train = Lambda(slice, arguments={'seq_length':1})(out)
model = Model(history_seq, pred_seq_train)
model.compile(Adam(), loss='mean_absolute_error')
<class 'numpy.ndarray'>
的实例。预期是一个符号张量实例。 - Roy