【问题标题】:How to modify keras model to get output between 0 to 7 except for just 0 and 1?如何修改 keras 模型以获得 0 到 7 之间的输出,除了 0 和 1?
【发布时间】:2019-10-12 01:11:04
【问题描述】:

我对数据科学和神经网络还很陌生。我有一个 unicode 句子数据集,它们被标记为 0 和 1 用于“垃圾邮件”或“非垃圾邮件”。我用于数据的模型是下面的代码(不包括数据预处理):

from keras.models import Model
from keras.layers import LSTM, Activation, Dense, Dropout, Input, Embedding

def RNN():
    inputs = Input(name='inputs',shape=[max_len])

    layer = Embedding(max_words,50,input_length=max_len)(inputs)

    layer = LSTM(64)(layer)

    layer = Dense(256,name='FC1')(layer)

    layer = Activation('relu')(layer)

    layer = Dropout(0.5)(layer)

    layer = Dense(1,name='out_layer')(layer)

    layer = Activation('sigmoid')(layer)
    # sigmoid aka 0 to 1 output

    model = Model(inputs=inputs,outputs=layer)

    return model


model.compile(loss='binary_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])

到目前为止,预测非常好。

但现在我修改了我的数据集。我添加了 6 列而不是“垃圾邮件”列,因此我的数据标签变为 [1-7] 之间的整数。数据集如下所示(案例 #1):

sentence | category
 sent 1  | 1
 sent 2  | 3
 sent 3  | 2
 sent 4  | 7
   .
   .
   .

我知道我可以添加虚拟变量并像这样修改它(案例#2):

sentence | category_1 | category_2 | category_3 |  ...  | category_7 
 sent 1  |     1      |     0      |     0      |       |     0 
 sent 2  |     0      |     0      |     1      |       |     0 
 sent 3  |     0      |     1      |     0      |       |     0 
 sent 4  |     0      |     0      |     0      |       |     1
   .
   .
   .

所以我熟悉数据集的特征工程部分。实际上我正在寻找的是修改代码以从模型中获得输出,例如 1,2,3,4,..(这意味着每个类别的预测)。

有谁知道我怎样才能以尽可能少的编辑来修改代码(keras 模型)?

任何其他提高准确性的建议(基于 NLP 和神经网络领域的经验)将不胜感激。

【问题讨论】:

    标签: python keras classification


    【解决方案1】:

    似乎您正在获得单热编码输出,以将其解码回整数

    decoded = np.argmax(encoded, axis=1)
    

    check the example here

    希望这会有所帮助。

    【讨论】:

    • 感谢您阅读我的问题,仔细考虑并回复。如果我是对的,您的回答似乎对特征工程部分有帮助。我实际上想从 1 到 7 的模型中获得整数预测(对于当前正在执行分类任务的模型,它曾经是 0 和 1)。
    • 如果您将示例代码放在问题代码中,我会很高兴,那么您的答案会更加清晰。
    • 解码后得到0到6的整数,全部加1即可。它会给你从 1 到 7 的标签。我不知道你问的是不是这个。
    【解决方案2】:

    layer = Dense(8,name='out_layer')(layer) 替换这一行 layer = Dense(8,name='out_layer')(layer) 就可以了。

    为了获得一个有 8 个值的数组,我们必须使用这个:

    from keras.models import Model
    from keras.layers import LSTM, Activation, Dense, Dropout, Input, Embedding
    
    def RNN():
        inputs = Input(name='inputs',shape=[max_len])
    
        layer = Embedding(max_words,50,input_length=max_len)(inputs)
    
        layer = LSTM(64)(layer)
    
        layer = Dense(256,name='FC1')(layer)
    
        layer = Activation('relu')(layer)
    
        layer = Dropout(0.5)(layer)
    
        layer = Dense(8,name='out_layer')(layer) 
    
        layer = Activation('sigmoid')(layer)
        # sigmoid aka 0 to 1 output
    
        model = Model(inputs=inputs,outputs=layer)
    
        return model
    
    
    model.compile(loss='binary_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])
    

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 2018-09-26
      • 2016-02-10
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多