【问题标题】:Keras LSTM and Embedding Concatenate Array Dimensions IssueKeras LSTM 和嵌入连接数组维度问题
【发布时间】:2019-05-28 22:53:51
【问题描述】:

我正在使用我在 Keras 中创建的嵌入层的 2 个分类特征构建一个用于多变量时间序列分类的 LSTM 网络。模型编译,架构显示在下面的代码中。我收到了ValueError: all the input array dimensions except for the concatenation axis must match exactly。这对我来说很奇怪,因为模型编译并且输出形状似乎匹配(沿轴连接的 3D 对齐 = -1)。模型拟合 X 参数是 3 个输入的列表(第一个分类变量数组、第二个分类变量数组和 LSTM 的多元时间序列输入 3-D)

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_4 (InputLayer)            (None, 1)            0                                            
__________________________________________________________________________________________________
input_5 (InputLayer)            (None, 1)            0                                            
__________________________________________________________________________________________________
VAR_1   (Embedding)             (None, 46, 5)        50          input_4[0][0]                    
__________________________________________________________________________________________________
VAR_2 (Embedding)               (None, 46, 13)       338         input_5[0][0]                    
__________________________________________________________________________________________________
time_series (InputLayer)        (None, 46, 11)       0                                            
__________________________________________________________________________________________________
concatenate_3 (Concatenate)     (None, 46, 18)       0           VAR_1[0][0]           
                                                                 VAR_2[0][0]               
__________________________________________________________________________________________________
concatenate_4 (Concatenate)     (None, 46, 29)       0           time_series[0][0]                
                                                                 concatenate_3[0][0]              
__________________________________________________________________________________________________
lstm_2 (LSTM)                   (None, 46, 100)      52000       concatenate_4[0][0]              
__________________________________________________________________________________________________
attention_2 (Attention)         (None, 100)          146         lstm_2[0][0]                     
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 1)            101         attention_2[0][0]                
==================================================================================================
Total params: 52,635
Trainable params: 52,635
Non-trainable params: 0
n_timesteps = 46
n_features = 11

def EmbeddingNet(cat_vars,n_timesteps,n_features,embedding_sizes):
    inputs = []
    embed_layers = []
    for (c, (in_size, out_size)) in zip(cat_vars, embedding_sizes):
        i = Input(shape=(1,))
        o = Embedding(in_size, out_size, input_length=n_timesteps, name=c)(i)
        inputs.append(i)
        embed_layers.append(o)

    embed = Concatenate()(embed_layers)

    time_series_input = Input(batch_shape=(None,n_timesteps,n_features ), name='time_series')

    inputs.append(time_series_input)

    concatenated_inputs = Concatenate(axis=-1)([time_series_input, embed])

    lstm_layer1 = LSTM(units=100,return_sequences=True)(concatenated_inputs)
    attention = Attention()(lstm_layer1)

    output_layer = Dense(1, activation="sigmoid")(attention)

    opt = Adam(lr=0.001)
    model = Model(inputs=inputs, outputs=output_layer)
    model.compile(loss='binary_crossentropy',optimizer=opt,metrics=['accuracy'])
    model.summary()

    return model 
model = EmbeddingNet(cat_vars,n_timesteps,n_features,embedding_sizes)

history = model.fit(x=[x_train_cat_array[0],x_train_cat_array[1],x_train_input], y=y_train_input, batch_size=8, epochs=1, verbose=1, validation_data=([x_val_cat_array[0],x_val_cat_array[1],x_val_input], y_val_input),shuffle=False)

【问题讨论】:

    标签: python-3.x keras deep-learning lstm theano


    【解决方案1】:

    我正在尝试同样的事情。您应该在轴 2 上连接。请检查HERE

    让我知道这是否适用于您的数据集,因为分类特征对我没有任何好处。

    【讨论】:

    • 我正在检查您的代码。一些评论(如果我错了,请纠正我):分类输入的 input_shape 不应该是(n_timesteps,)而不是(1,)吗?而且由于您使用的是多对多架构,您不应该在 LSTM 之后和进行最终预测之前添加 TimeDistributed 层吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 2018-01-11
    • 1970-01-01
    • 2019-05-17
    • 2018-02-10
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多