Показатели производительности не меняются при настройке модели или гиперпараметра - PullRequest
0 голосов
/ 08 июля 2019

У меня проблема с моими моделями, когда все они предоставляют одинаковые метрики независимо от того, какая модель (двунаправленная LSTM, однонаправленная или CNN) или каких параметров (скорость обучения, выпадение, уровни). Например, для модели CNN это [['f1score', 0.8137931034482759], ['precision', 0.686046511627907], ['rev', 1.0], ['precision', 0.686046511627907]]. LSTM также [['f1score', 0.8137931034482759], ['precision', 0.686046511627907], ['rev', 1.0], ['precision', 0.686046511627907]].

Я пытался изменить скорость обучения, добавил отсев, больше слоев. Получить те же точные показатели, перечисленные выше. Странно то, что несколько дней назад, когда я тестировал модель CNN (тот же код), она давала мне гораздо лучшие и разные метрики с точностью около 80%. Просто для справки, я делаю перекрестную проверку с 5-кратными сгибами, и в настоящее время я сосредоточен на бинарной классификации. У меня около 800 образцов данных. Я пытался изменить эпохи и размер партии, но это мало что изменило. Я использую кластерные вычисления, поэтому я не уверен, влияет ли это на это. У меня есть модель CNN и модель LSTM Unidirection ниже, например.

def CNN_model(word_index, embedding_matrix, max_len, categorical):
    model = Sequential()
    optm = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
    model.add(Embedding(len(word_index)+1, 300, weights=[embedding_matrix], input_length=max_len, trainable=False))
    #model.add(Dropout(0.2))
    model.add(Conv1D(128, 5, activation='relu'))
    model.add(GlobalMaxPooling1D())
    model.add(Dense(10))
    #model.add(BatchNormalization())     #BATCH NORMALIZATION   
    model.add(Activation('relu'))
    if (categorical):
        model.add(Dense(3, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer=optm, metrics=['accuracy'])
    else:
        model.add(Dense(1, activation='sigmoid'))
        model.compile(loss='binary_crossentropy', optimizer=optm, metrics=['accuracy'])

    return model

def LSTM_Uni_model(word_index, embedding_matrix, max_len, categorical):
    optm = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
    model = Sequential()
    model.add(Embedding(len(word_index)+1, 300, weights=[embedding_matrix], input_length=max_len, trainable=False))
    model.add(Dropout(0.2))    #DROPOUT
    model.add(Conv1D(filters=32, kernel_size=3, padding='same'))
    #model.add(BatchNormalization())     #BATCH NORMALIZATION   
    model.add(Activation('relu'))
    model.add(MaxPooling1D(pool_size=2))
    model.add(LSTM(100))
    #model.add(BatchNormalization())     #BATCH NORMALIZATION
    if (categorical):
        model.add(Dense(3, activation='softmax'))
        model.compile(loss='categorical_crossentropy', optimizer=optm, metrics=['accuracy'])
    else:
        model.add(Dense(1, activation='sigmoid'))
        model.compile(loss='binary_crossentropy', optimizer=optm, metrics=['accuracy'])

    return model


def LSTM_Uni(X_train, y_train, X_test, y_test, word_index, embedding_matrix, max_len, seed, categorical):
    earlystop = EarlyStopping(monitor='val_loss', min_delta=0, patience=2, verbose=1, mode='auto', restore_best_weights=True) # pateince is number of epochs
    callbacks_list = [earlystop]
    if (categorical):
        kfold = list(KFold(n_splits=5, shuffle=True, random_state=seed).split(X_train, y_train))
    else:
        kfold = list(StratifiedKFold(n_splits=5, shuffle=True, random_state=seed).split(X_train, y_train))
    model_infos = []
    metrics = []
    model = None
    for i,(train, test) in enumerate(kfold):
        model = None
        model = LSTM_Uni_model(word_index, embedding_matrix, max_len, categorical)
        model_info=model.fit(X_train[train], y_train[train], epochs=10, batch_size=12, validation_data=(X_train[test], y_train[test]),
                               callbacks=callbacks_list, verbose=1)
        print("Performance plot of fold {}:".format(i+1))
        # summarize history in plot
        plot_model_history(model_info)
        model_infos.append(model_info)

        #Final evaluation of the model
        metrics, y_pred = evaluate_model(metrics, categorical, model, y_test, X_test)

    print(model.summary())

    return y_pred, metrics, model_infos

Я предоставил только код перекрестной проверки для LSTM Unidirectional, но у меня есть другой набор кода с почти таким же кодом, но для CNN. У меня нет ошибок, каждая из моделей предоставляет метрики. Единственная проблема, как уже говорилось, в том, что это то же самое для каждой модели. Я немного новичок в области глубокого обучения, поэтому понятия не имею, делаю ли я где-нибудь небольшую ошибку.

...