如何修改keras模型以获取0到7(除了0和1之外)之间的输出?

时间:2019-05-25 23:20:15

标签: python keras classification

我对数据科学和神经网络非常陌生。我有一个unicode句子的数据集,它们被标记为“ spam”或“ not_spam”的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列而不是“ spam”列,因此我的数据标签变成了[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和神经网络领域的经验)任何其他提高准确性的建议也将受到赞赏。

2 个答案:

答案 0 :(得分:1)

好像您正在获得一键编码的输出,将其解码回整数

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

check the example here

希望这会有所帮助。

答案 1 :(得分:0)

用此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'])