Keras будет работать с одним подходом к токенизации слов, но не с другим - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть фрейм данных со следующими данными:

        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)

Что я не понимаю, так это то, почему первый подход «работает» - модель будет обучаться и проверять, а второй подход всегда равен нулю для проверки / обучения и потери?

Что делает такую ​​большую разницу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...