Почему реализация уровня Keras OneHot отличается от обучающих данных OneHot? - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу изучить коннет, чтобы классифицировать> 240 000 документов приблизительно в 2000 классах.Для этого я выбрал первые 60 слов и преобразовал их в индексы.Я попытался внедрить слой OneHot в Keras, чтобы избежать проблем с памятью, но модель работает намного хуже, чем модель с данными, уже подготовленными как OneHot.В чем реальная разница?

Сводные отчеты моделей аналогичны по форме и параметрам, за исключением дополнительного лямбда-слоя One_hot.Я использовал описанную здесь функцию One_Hot: https://fdalvi.github.io/blog/2018-04-07-keras-sequential-onehot/

def OneHot(input_dim=None, input_length=None): 
# input_dim refers to the eventual length of the one-hot vector (e.g. 
vocab size)
# input_length refers to the length of the input sequence
# Check if inputs were supplied correctly
if input_dim is None or input_length is None:
    raise TypeError("input_dim or input_length is not set")

# Helper method (not inlined for clarity)
def _one_hot(x, num_classes):
    return K.one_hot(K.cast(x, 'uint8'),
                      num_classes=num_classes)

# Final layer representation as a Lambda layer
return Lambda(_one_hot,
              arguments={'num_classes': input_dim},
              input_shape=(input_length,))

# Model A :  This is the Keras model I use with the OneHot function:
model = Sequential()
model.add(OneHot(input_dim=model_max,
                     input_length=input_length))
model.add(Conv1D(256, 6, activation='relu'))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(3)) 
model.add(Conv1D(128, 3, activation='relu'))
model.add(Conv1D(128, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(labels_max, activation='softmax'))
checkpoint = ModelCheckpoint('model-best.h5', verbose=1, 
monitor='val_loss',save_best_only=True, mode='auto')
model.compile(optimizer=Adam(),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

#Model B: And this model I use with the data already converted to OneHot:
model = Sequential()
model.add(Conv1D(256, 6, activation='relu', input_shape=(input_length, 
model_max)))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(128, 3, activation='relu'))
model.add(Conv1D(128, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(labels_max, activation='softmax'))
checkpoint = ModelCheckpoint('model-best.h5', verbose=1, 
monitor='val_loss',save_best_only=True, mode='auto')
model.compile(optimizer=Adam(),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

Модель B работает намного лучше с точностью проверки до 60%, но она легко приводит к ошибкам памяти.Модель A намного быстрее, но достигает максимальной точности проверки 25%.Я ожидал бы, что они выполнят подобное.Что мне здесь не хватает?Спасибо!

...