【问题标题】:Keras LSTM predict two features from one input in Text classification?Keras LSTM 从文本分类中的一个输入预测两个特征?
【发布时间】:2018-08-18 19:12:18
【问题描述】:

我有 X 作为文本,有两个不同的标签(列)要训练。

--input.csv--
content, category, rate
text test, 1, 3
new test, 2, 2

这里我的输入 X 将是内容。我已将其转换为序列矩阵。我需要与内容一起训练类别和速率。我不知道如何在图层中传递它。

def RNN():
    num_categories = 2
    num_rates = 3
    inputs = Input(name='inputs',shape=[max_len])

    layer = Embedding(max_words,150,input_length=max_len)(inputs)
    layer = LSTM(100)(layer)

    shared_layer = Dense(256, activation='relu', name='FC1')(layer)
    shared_layer = Dropout(0.5)(shared_layer)

    cat_out = Dense(num_categories, activation='softmax', name='cat_out')(shared_layer)
    rate_out = Dense(num_rates, activation='softmax', name='rate_out')(shared_layer)

    model = Model(inputs=inputs,outputs=[cat_out, rate_out])
    return model

model = RNN()
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  
model.fit(sequences_matrix,[Y_train, Z_train])

Y_train 仅包含类别。我想为培训增加费率。有人知道吗? 我想要两个结果。一个应该是关于类别的,另一个是速率。 目前它只返回标签。不随率。我不知道如何为 Rate 列添加图层。

【问题讨论】:

  • 可以添加sequences_matrixY_train的形状
  • 你的问题毫无意义。您谈论标签中的问题,但发布模型的代码。您给出的错误涉及您的标签的输入形状,其代码无处可寻。想想你想回答什么并编辑你的问题。根据您的问题可以得到什么,是什么阻止您将类别和费率都放入标签中?如果您在np.arrays 中同时拥有这两个值,那么简单的np.concatenate 已经可以解决问题了。
  • 好的。我会更新问题。

标签: python keras text-classification


【解决方案1】:

您可以使用功能 API 来实现这一点,只需让网络从共享特征层获得 2 个输出:

shared_layer = Dense(256, activation='relu', name='FC1')(layer)
shared_layer = Dropout(0.5)(shared_layer)
cat_out = Dense(num_categories, activation='softmax', name='cat_out')(shared_layer)
rate_out = Dense(num_rates, activation='softmax', name='rate_out')(shared_layer)

model = Model(inputs=inputs,outputs=[cat_out, rate_out])
return model

您现在将使用两个目标进行训练,y_train_caty_train_rate,并将它们作为列表提供给 model.fit(X_train, [y_train_cat, y_train_rate]),模型将做出两个不同的预测。

查看功能 API documentation,了解如何处理多输入/多输出模型。

【讨论】:

  • 我想你也忘了将shared_layer 传递给rate_out 层。
  • 图层编译成功。谢谢...!但还有一个问题。 ValueError: 检查目标时出错:预期 cat_out 的形状为 (2,) 但得到的数组的形状为 (1,) --code--- le = LabelEncoder() Y = le.fit_transform(Y) Y = Y.reshape( -1,1) @nuric
  • 你为什么要重塑,你的 y 目标应该是 2D 形状的 (samples, num_categories)(samples, num_rates) 作为列表传递给 fit 函数。
  • 你是这个意思吗? Y_train = Y_train.reshape(Y_train.shape[0], num_categories) print(Y_train.shape) ValueError: cannot reshape array of size 219 into shape (219,2) @nuric
  • 哦,我明白了,您的标签很稀疏,所以只需 [0, 1, 1, 2, 0, ...] 在这种情况下,您需要使用 loss='sparse_categorical_crossentropy' 编译您的模型,以便它自动将标签索引扩展为单热向量。
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多