Я использую байесовскую оптимизацию, чтобы найти хорошую модель для категориального временного ряда. Я стремлюсь максимизировать val_categorical_accuracy, однако пока он никогда не улучшается выше 0,4. Что-то не так с моей гипермоделью ниже?
class v7_HyperModel_C(HyperModel):
def build(self, hp):
model = Sequential()
# Input layer
model.add(LSTM(INPUT_NODES, return_sequences=True,
input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization(axis=-1)),
model.add(Dropout(hp.Float('dropout_input', min_value=0.8, max_value=0.9, step=0.05)))
for i in range(hp.Int('num_fb_layers', 1, 5)):
model.add(LSTM(hp.Int('hidden_fb_nodes', min_value=INPUT_NODES, max_value=INPUT_NODES * 10, step=INPUT_NODES),
return_sequences=True))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(Dropout(hp.Float('dropout_fb_hidden', min_value=0.5, max_value=0.8, step=0.05)))
model.add(LSTM(hp.Int('hidden_nonfb_nodes', min_value=INPUT_NODES, max_value=INPUT_NODES * 10, step=INPUT_NODES)))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(Dropout(hp.Float('dropout_nonfb_hidden', min_value=0.5, max_value=0.8, step=0.05)))
model.add(Dense(units=POSSIBLE_OUTCOME_COL))
model.add(LeakyReLU(alpha=0.1))
model.compile(
#loss='mse',
loss='categorical_crossentropy',
run_eagerly = True,
optimizer=keras.optimizers.Adam(learning_rate=hp.Choice('learning_rate', [1e-3, 1e-4, 1e-5, 1e-6])),
metrics = ['categorical_accuracy']
)
return model
hypermodel = v7_HyperModel_C()
current_project_name = 'M6_tuning_C'
DEVICE='CPU'
with tf.device(DEVICE):
tuner = BayesianOptimization(
hypermodel,
objective=Objective('val_categorical_accuracy', direction="max"),
num_initial_points=20,
max_trials=300,
directory='./V7_C/',
project_name=current_project_name)
tuner.search(train_X, train_y,
epochs=100,
validation_split=0.1,
verbose=1)
Кроме того, пока я жду завершения оптимизации, я отдельно создал модель, пытаясь сделать некоторые тестовые прогнозы с гиперпараметрами с наилучшей на данный момент точностью, которая составляет около 0,4.
Я обучал модель 500 эпохам, надеясь, что точность превысит 0,4.
def v7_HyperModel_C():
model = Sequential()
# Input layer
model.add(LSTM(INPUT_NODES, return_sequences=True,
input_shape=(train_X.shape[1], train_X.shape[2])))
#model.add(LeakyReLU(alpha=0.1))
model.add(ReLU())
model.add(BatchNormalization(axis=-1)),
model.add(Dropout(0.9))
# Hidden Layers with feedback
for i in range(3):
model.add(LSTM(210, return_sequences=True))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(Dropout(0.7))
model.add(LSTM(70))
model.add(LeakyReLU(alpha=0.1))
model.add(BatchNormalization())
model.add(Dropout(0.55))
# Output layer
model.add(Dense(units=POSSIBLE_OUTCOME_COL))
model.add(LeakyReLU(alpha=0.1))
model.compile(
loss='categorical_crossentropy',
run_eagerly = True,
optimizer=keras.optimizers.Adam(learning_rate=0.001),
metrics = ['categorical_accuracy']
)
return model
но в конце обучения точность даже не коснулась 0,4. Что может пойти не так? Любые мысли приветствуются.
Можете ли вы предоставить более подробное описание задачи, которую вы пытаетесь решить, или системы, которую вы пытаетесь смоделировать? Кроме того, можете ли вы объяснить, почему вы выбрали именно эту модель для этой задачи? Трудно увидеть проблему, просто взглянув на архитектуру модели.