我有一个numpy数组,其形状为(观察数,时间步数,要素数)。这相当于每个长度为24(上述时间步长)的59个特征(即时间序列)。这是用于输入RNN的标准设置。
我想做的是将其输入模型,第一步是分别对每个序列进行一维卷积,然后将59个输出连接到下一层(密集层或LSTM,然后是密集层)。 / p>
如果我遍历多个要素并将卷积应用于每个系列,则应如何构造输入X?
例如,说我的数据如下:
var=np.array([[[1., 3., 5., 7.],
[2., 4., 6., 8.]],
[[9., 11., 13., 15.],
[10., 12., 14., 16.]],
[[17., 19., 21., 23.],
[18., 20., 22., 24.]]])
其中第一个观测值的时间序列1为[1,2],第二个观测值的时间序列为[3,4] ....,第一个观测值的第四时间序列为[7,8]。
nb_filters=(8,4)
filter_length=(5,5)
dense=(16,8)
conv_layers=[]
input=Input(shape=(None,no_timesteps,no_features))
for i in range(no_features):
series=Lambda(lambda x: x[:, i])(input)
print(series.shape)
conv_layer=Conv1D(nb_filters[0], kernel_size=filter_length[0], padding='valid',activation='relu')(series)
conv_layer = MaxPooling1D()(conv_layer)
conv_layer=Conv1D(nb_filters[1], kernel_size=filter_length[1], padding='valid',activation='relu')(conv_layer)
conv_layer = MaxPooling1D()(conv_layer)
conv_layers.append(conv_layer)
merge_layer=Concatenate(axis=1)(conv_layers)
merge_layer= Flatten()(merge_layer)
output=Dense(dense[0], activation='sigmoid')(merge_layer)
nn=Model(inputs=inputs,outputs=output)
nn.compile(optimizer=RMSprop(), loss='binary_crossentropy')
nn.summary()
nn.fit(X,y, epochs=5)
首先,这不能按预期方式工作,因为print语句的形状为(?,24,59),这似乎并不表示我实际上在lambda中进行切片。我希望每个切片都是特定的时间序列形状(1,24),其中24是每个序列的长度。这个想法是让一维卷积在这个单个时间序列上运行(对所有59个序列重复)并将它们连接在一起。
答案 0 :(得分:0)
输入形状必须仅包含时间步长和 num_features。 因此,而不是:
input=Input(shape=(None, no_timesteps,no_features))
试试:
input=Input(shape=(no_timesteps,no_features))
答案 1 :(得分:-1)
您必须使用:
input=Input(shape=(None, no_timesteps,no_features))
或
input=Input(shape=(number_of_samples, no_timesteps,no_features))
输入层是张量,其形状必须与训练数据相同。