【问题标题】:Which of 3 classes does the model.predict() output corresponds to?model.predict() 输出对应于 3 个类中的哪一个?
【发布时间】:2020-03-07 17:40:13
【问题描述】:

当我加载经过训练的模型并为其提供新数据以进行预测时 (model.predict(textstr)) 我得到:

[[0.3345264  0.33339804 0.33207548]]

使用如下所示的数据框训练模型:

                text  sent
1     Textstring1...     1
2     Textstring2...     2
3     Textstring3...     0
4     Textstring4...     0
5     Textstring5...     2

我如何判断哪个类(发送,训练值)对应于我得到的输出?上面的 0.3345264 值是否对应模型发送的 0 作为答案?

以下是模型及其配置的一些细节:

 model = tf.keras.Sequential([
            tf.keras.layers.Embedding(VOC, EMB_SIZE),
            tf.keras.layers.GlobalAveragePooling1D(),
            tf.keras.layers.Dense(node1,activation='relu'),
            tf.keras.layers.Dropout(dropout),
            tf.keras.layers.Dense(3, activation='softmax')])

 model.compile(optimizer='adadelta',
              loss='sparse_categorical_crossentropy',
              metrics=['sparse_categorical_accuracy'])

提前致谢。

更新编辑2: 我像这样使用标记器来创建 train_seqs:

      tokenizer = tf.keras.preprocessing.text.Tokenizer(
            num_words=WORDS
          , oov_token='<UNK>')
        tokenizer.fit_on_texts(train_df['text'])


    #convert text data to numerical indexes
        train_seqs=tokenizer.texts_to_sequences(train_df['text'])
        test_seqs=tokenizer.texts_to_sequences(test_df['text'])

#pad data up to SEQ_LEN (note that we truncate if there are more than SEQ_LEN tokens)
    train_seqs=tf.keras.preprocessing.sequence.pad_sequences(
       train_seqs
       , maxlen=SEQ_LEN
       , padding="post")
    test_seqs=tf.keras.preprocessing.sequence.pad_sequences(
       test_seqs
       , maxlen=SEQ_LEN
       , padding="post")

train_seqs
Out[12]: 
array([[ 144,    8,   46, ...,   42,    3, 1734],
       [   6,  315,  277, ...,   44, 2247, 2095],
       [   5,   18,  162, ...,  159,   56, 1483],
       ...,
       [   9,  132,   76, ...,  194,  234, 1628],
       [ 660,   66,    7, ...,    0,    0,    0],
       [ 514,  879,  126, ...,    6,   68,  590]], dtype=int32)

train_df['sent'].values
Out[13]: array([1, 0, 2, ..., 0, 1, 0])

history = model.fit(train_seqs, train_df['sent'].values
                    , batch_size=BATCH_SIZE
                    , epochs=EPOCHS
                    , validation_split=0.2
                    , callbacks=callbacks)

【问题讨论】:

  • 请提供您如何准备数据集
  • 我的意思是当你运行 model.fit(...) 时,你必须传递 X 和 Y 作为输入和输出。能否请您发布用于生成 X 和 Y 的代码,以及使用 fit 方法的代码?
  • @alan.elkin 我更新了问题......

标签: python tf.keras


【解决方案1】:

如果我理解正确,您想预测 sent 列,这似乎是一个分类变量,其值可能是 0、1 或 2。您的最后一层是 3 个神经元(具有 softmax 激活),因此每次推理您将有 3 个输出。我假设您使用 One Hot Encoding 之类的东西作为基本事实输出。预测的顺序将与您的 One Hot Encoder 设置的顺序相同。

您是如何准备数据集地面实况输出的?

更新:

这实际上是一个很好的问题,因为没有太多关于它的文档。 我搜索了一下,发现了一个关于 SO 的类似问题,所以我询问了更多详细信息here

如果使用sparse_categorical_crossentropy,您的类别 已分配到编号 0 实际上是 0 类;您拥有的类别 分配给 1 号的实际上是 1 级;等等。例如,如果 你使用来自 sklearn 的LabelEncoder,你可以找到这个映射 通过 .classes_ 属性(参见文档和示例)。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 2022-01-19
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多