Keras将使用一种方法来标记单词,但不会使用另一种方法

时间:2019-02-20 01:28:00

标签: python keras artificial-intelligence

我有一个包含以下数据的数据框:

        gender  gender_count    name    vectorized                    indexised ends_a
18948   1       308             macel   [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]  [12, 0, 2, 4, 11, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] 0

我使用两种方法来标记单词:

a-z词典中的字母数:

char_dict = [(key,value) for key, value in enumerate(string.ascii_lowercase)]
def vectorize(text, dictionary=char_dict): 
    vector = np.zeros(len(dictionary)) 
    for i, word in dictionary: 
        num = 0 
        for w in text: 
            if w == word: 
                num += 1 
        if num: 
            vector[i] = num 
    return vector

a-z词典中字母位置的索引:

def indexise(name):
    #longest word len: 15
    name = name.lower()
    word = [string.ascii_lowercase.index(x) for x in name]
    for x in range(15-len(word)):
        word.append(np.nan)
    return word

如下面的@hobbs所建议,如果我将这种方法中的空字母从np.nan更改为-2,则输出不是零,而是非常接近零的第一种方法模型可产生0.72的准确度(提高20倍):

Log-loss (cost function):
training   (min:    5.469, max:    5.777, cur:    5.470)
validation (min:    7.109, max:    7.452, cur:    7.445)

Accuracy:
training   (min:    0.023, max:    0.119, cur:    0.025)
validation (min:    0.027, max:    0.137, cur:    0.031)

两种方法中我都使用相同的模型,唯一不同的是input_dim

model = Sequential()
model.add(Dense(32, input_dim=26, activation='relu'))
model.add(Dense(1, activation='relu'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X1, Y1, epochs=50, batch_size=1000, validation_split=.2, callbacks=[PlotLossesKeras()], verbose=False)

我不明白的是为什么第一种方法“有效”-模型将进行训练和验证,而第二种方法对于验证/训练和损失始终为零?

什么与众不同?

0 个答案:

没有答案