【问题标题】:How to input a mix feature into a LSTM model?如何将混合特征输入到 LSTM 模型中?
【发布时间】:2021-08-09 14:38:45
【问题描述】:

假设,我有两个特征:x1 和 x2。这里,x1 是词索引向量x2 是数值向量。 x1 和 x2 的长度等于 50。每个 x1 和 x2 有 6000 行。我将这两者合二为一,例如

X = np.array([np.row_stack((x1[i], x2[i])) for i in range(x1.shape[0])])

我最初的 LSTM 模型是

X_input = Input(shape = (50, 2), name = "X_seq")
X_hidden1 = LSTM(units = 256, dropout = 0.25, return_sequences = True)(X_input)
X_hidden2 = LSTM(units = 256, dropout = 0.25, return_sequences = True)(X_hidden1)
X_hidden3 = LSTM(units = 128, dropout = 0.25)(X_hidden2)
X_dense = Dense(units = 128, activation = 'relu')(X_hidden3)
X_dense_dropout = Dropout(0.25)(X_dense)

concat = tf.keras.layers.concatenate(inputs = [X_dense_dropout])
output = Dense(units = num_category, activation = 'softmax', name = "output")(concat)
model = tf.keras.Model(inputs = [X_input], outputs = [output])
model.compile(optimizer = 'adam', loss = "sparse_categorical_crossentropy", metrics = ["accuracy"])

但是,我知道我需要一个嵌入层来处理输入层下方的X[0,:]。因此,我将上面的代码修改为

X_input = Input(shape = (50, 2), name = "X_seq")
x1_embedding = Embedding(input_dim = max_pages, output_dim = embedding_dim, input_length = max_length)(X_input[0,:])
X_concat = tf.keras.layers.concatenate(inputs = [x1_embedding, X_input[1,:]])
X_hidden1 = LSTM(units = 256, dropout = 0.25, return_sequences = True)(X_concat)
X_hidden2 = LSTM(units = 256, dropout = 0.25, return_sequences = True)(X_hidden1)
X_hidden3 = LSTM(units = 128, dropout = 0.25)(X_hidden2)
X_dense = Dense(units = 128, activation = 'relu')(X_hidden3)
X_dense_dropout = Dropout(0.25)(X_dense)

concat = tf.keras.layers.concatenate(inputs = [X_dense_dropout])
output = Dense(units = num_category, activation = 'softmax', name = "output")(concat)
model = tf.keras.Model(inputs = [X_input], outputs = [output])
model.compile(optimizer = 'adam', loss = "sparse_categorical_crossentropy", metrics = ["accuracy"])

Python 显示错误

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 2, 15), (None, 2)]

有什么建议吗?非常感谢

【问题讨论】:

  • x1_embedding 是一个 3 维矩阵(Keras 自动为批量大小添加一个额外的维度,因此 noneX_input[:,1] 是 2 维,即所有行和索引 = 1 列. 你可能想做类似X_input[:,:,1] 的事情来获得批量维度

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

问题是concat 层的输入具有不同的维度,因此我们不能concat 他们。为了克服这个问题,我们可以像下面那样使用tf.keras.layers.Reshape 重塑concat 层的输入,其余部分相同。

reshaped_input = tf.keras.layers.Reshape((-1,1))(X_input[:, 1])
X_concat = tf.keras.layers.concatenate(inputs = [x1_embedding, reshaped_input])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 2011-04-23
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多