У меня проблема с моими моделями, когда все они предоставляют одинаковые метрики независимо от того, какая модель (двунаправленная 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. У меня нет ошибок, каждая из моделей предоставляет метрики. Единственная проблема, как уже говорилось, в том, что это то же самое для каждой модели. Я немного новичок в области глубокого обучения, поэтому понятия не имею, делаю ли я где-нибудь небольшую ошибку.