代码之家  ›  专栏  ›  技术社区  ›  userxxx

如何在Keras中使用附加功能和单词嵌入?

  •  16
  • userxxx  · 技术社区  · 7 年前

    我正在数据集上使用Keras训练一个LSTM模型,如下所示。变量“Description”是一个文本字段,“Age”和“Gender”是分类的连续字段。

    Age, Gender, Description
    22, M, "purchased a phone"
    35, F, "shopping for kids"
    

    我使用单词嵌入将文本字段转换为单词向量,然后将其输入到keras模型中。代码如下:

    model = Sequential()
    model.add(Embedding(word_index, 300, weights=[embedding_matrix], input_length=70, trainable=False))
    
    model.add(LSTM(300, dropout=0.3, recurrent_dropout=0.3))
    model.add(Dropout(0.6))
    model.add(Dense(1))
    model.add(Activation('sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics['accuracy'])
    

    这个模型正在成功运行,但我想输入“年龄”和“性别”变量以及特性。要使用这些特性,代码中还需要做哪些更改?

    3 回复  |  直到 7 年前
        1
  •  13
  •   Andrew Lavers    6 年前

    如果您想添加更多的输入层,而这在顺序模型中是不可能的,那么您必须使用功能模型

    from keras.models import Model
    

    它允许您有多个输入和间接连接。

    embed = Embedding(word_index, 300, weights=[embedding_matrix], input_length=70, trainable=False)
    lstm = LSTM(300, dropout=0.3, recurrent_dropout=0.3)(embed)
    agei = Input(shape=(1,))
    conc = Concatenate()(lstm, agei)
    drop = Dropout(0.6)(conc)
    dens = Dense(1)(drop)
    acti = Activation('sigmoid')(dens)
    
    model = Model([embed, agei], acti)
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics['accuracy'])
    

    你们不能在LSTM层之前连接,因为它并没有意义,而且你们在嵌入层之后会有3D张量,输入是2D张量。

        2
  •  6
  •   ixeption    4 年前

    我写过 how to do this in keras 。它基本上是一个功能性多输入模型,将两个特征向量连接起来,如下所示:

    nlp_input = Input(shape=(seq_length,), name='nlp_input')
    meta_input = Input(shape=(10,), name='meta_input')
    emb = Embedding(output_dim=embedding_size, input_dim=100, input_length=seq_length)(nlp_input)
    nlp_out = Bidirectional(LSTM(128))(emb)
    x = concatenate([nlp_out, meta_input])
    x = Dense(classifier_neurons, activation='relu')(x)
    x = Dense(1, activation='sigmoid')(x)
    model = Model(inputs=[nlp_input , meta_input], outputs=[x])
    
        3
  •  2
  •   modesitt    7 年前

    考虑使用一个单独的前馈网络来接收这些特征并输出一些n维向量。

    time_independent = Input(shape=(num_features,))
    dense_1 = Dense(200, activation='tanh')(time_independent)
    dense_2 = Dense(300, activation='tanh')(dense_1)
    

    首先,请使用keras' functional API 做这样的事。

    然后,您可以将其作为LSTM的隐藏状态传入,也可以将其与每个单词嵌入连接起来,以便LSTM在每个时间步都能看到它。在后一种情况下,您可能希望大幅降低网络的维数。

    如果你需要一个例子,请告诉我。