我有numpy数组形式的训练数据,将在ConvLSTM中使用。
以下是数组的尺寸。
trainX = (5000, 200, 5)
其中5000是样本数。 200是每个样本的时间步长,8是每个时间步长的特征数。(样本,时间步长,特征)。
在这8个特征中,有3个特征在样本中的所有时间步中都保持不变(换句话说,这些特征与样本直接相关)。例如,星期几,月份号,工作日(这些随样本的不同而变化)。为了降低复杂度,我想将这三个功能与初始训练集分开,并将它们与convlstm层的输出合并,然后再应用密集层进行分类(softmax激活)。例如
初始训练集维将为(7000, 200, 5)
,要合并的辅助输入维将为(7000, 3)
->因为这3个特征与样本直接相关。如何使用keras来实现此目的?
以下是我使用Functional API编写的代码,但不知道如何合并这两个输入。
#trainX.shape=(7000,200,5)
#trainy.shape=(7000,4)
#testX.shape=(3000,200,5)
#testy.shape=(3000,4)
#trainMetadata.shape=(7000,3)
#testMetadata.shape=(3000,3)
verbose, epochs, batch_size = 1, 50, 256
samples, n_features, n_outputs = trainX.shape[0], trainX.shape[2], trainy.shape[1]
n_steps, n_length = 4, 50
input_shape = (n_steps, 1, n_length, n_features)
model_input = Input(shape=input_shape)
clstm1 = ConvLSTM2D(filters=64, kernel_size=(1,3), activation='relu',return_sequences = True)(model_input)
clstm1 = BatchNormalization()(clstm1)
clstm2 = ConvLSTM2D(filters=128, kernel_size=(1,3), activation='relu',return_sequences = False)(clstm1)
conv_output = BatchNormalization()(clstm2)
metadata_input = Input(shape=trainMetadata.shape)
merge_layer = np.concatenate([metadata_input, conv_output])
dense = Dense(100, activation='relu', kernel_regularizer=regularizers.l2(l=0.01))(merge_layer)
dense = Dropout(0.5)(dense)
output = Dense(n_outputs, activation='softmax')(dense)
model = Model(inputs=merge_layer, outputs=output)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit([trainX, trainMetadata], trainy, validation_data=([testX, testMetadata], testy), epochs=epochs, batch_size=batch_size, verbose=verbose)
_, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
y = model.predict(testX)
但是在merge_layer语句中出现Value错误。以下是ValueError
ValueError: zero-dimensional arrays cannot be concatenated
答案 0 :(得分:0)
使用Keras的Sequential
模式无法完成您所说的话。
您需要使用Model类API Guide to Keras Model。
使用此API,您可以构建所需的复杂模型
这里有一个使用方法的示例:How to Use the Keras Functional API for Deep Learning