TransWikia.com

Как оптимизировать регрессию с несколькими переменными?

Stack Overflow на русском Asked on January 1, 2022

введите сюда описание изображения

Пытаюсь сделать регрессию со многими переменными. На входе 82 значения.

Не могу разобраться с ошибкой.

Подскажите, как еще оптимизировать?

def linear_model():
  model = keras.Sequential([
        keras.layers.Dense(250, activation='relu', input_shape=(82,)),
        keras.layers.Dense(250, activation='relu'),
        keras.layers.Dense(1, activation='sigmoid')
      ])

# Задание оптимизатора
  optimizer = tf.keras.optimizers.Adam(
      learning_rate=0.01, beta_1=0.9, beta_2=0.99, epsilon=1e-05, amsgrad=False,
      name='Adam')

# Задание параметров модели
  model.compile(optimizer='adam',
                       loss='binary_crossentropy',
                       metrics=['accuracy', 'binary_crossentropy'])
  return model

# Создание модели ранее созданой функцией
model = linear_model()

# Вывод информации о модели
model.summary()

# Задание параметров Нйероной сети
n_epochs = 100
batch_size = 30
n_idle_epochs = 10
n_epochs_log = 10
n_samples_save = n_epochs_log * trainInput.shape[0]
print('Checkpoint is saved for each {} samples'.format(n_samples_save))

# Механихм остановки обучение при отсутствии дальнейшего прогресса обучения
earlyStopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=n_idle_epochs,         
min_delta=0.001)

# Создание настраиваемого обратного вызова для печати журнала после определенного количества эпох
predictions_list = []
class NEPOCHLogger(tf.keras.callbacks.Callback):
    def __init__(self,per_epoch=100):
        #  количество пакетов для ожидания перед выводом потерь
        self.seen = 0
        self.per_epoch = per_epoch

    def on_epoch_end(self, epoch, logs=None):
      if epoch % self.per_epoch == 0:
        print('Epoch {}, loss {:.2f}, val_loss {:.2f}, mae {:.2f}, val_mae {:.2f}, mse {:.2f}, val_mse {:.2f}'
          .format(epoch, logs['loss'], logs['val_loss'],logs['mae'], logs['val_mae'],logs['mse'], logs['val_mse']))
          
# Вызов объекта
log_display = NEPOCHLogger(per_epoch=n_epochs_log)

# Включаем эпоху в имя файла
checkpoint_path = "training/cp-{epoch:05d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

# Создаем обратный вызов, который сохраняет веса модели
checkpointCallback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_path, 
    verbose=1, 
    save_weights_only=True,
    save_freq=n_samples_save)

# Сохроняем веса
model.save_weights(checkpoint_path.format(epoch=0))

# Определяем обратный вызов Keras TensorBoard
logdir="logs/fit/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

history = model.fit(
  trainInput, trainTarget, batch_size=batch_size,
  epochs = n_epochs, validation_split = 0.1, verbose=0, callbacks=    
[earlyStopping,log_display,tensorboard_callback,checkpointCallback])

2 Answers

Я думаю что колбек не отслеживает maе из-за того что функция потери binary_crossentropy,если была бы mse,может mae отслеживала бы.

Answered by Константин on January 1, 2022

У вас тут целый ряд логических ошибок. Я бы вам посоветовал идти от простого к сложному небольшими шагами - начните с самой простой реализации и дальше уже можно заниматься настройкой - добавлять callbacks и т.д.

Если у вас задача регрессии, то вы выбрали неправильную архитектуру сети. В частности функция активации sigmoid в выходном слое используется в основном для задач бинарной классификации. Тоже самое относится к функции потери binary_crossentropy.

Для задач регрессии в качестве функции активации в выходном слое обычно используют линейную функцию активации, а в качестве функции ошибки - mse, mae или mean_squared_logarithmic_error.

Пример простой архитектуры:

model = Sequential()
model.add(Dense(250, activation="relu", input_shape=(82,)))
model.add(Dense(250, activation="relu"))
model.add(Dense(1))  # NOTE: по умолчанию используется линейная функция активации

model.compile(loss='mse', optimizer="adam", metrics=["mse", "mae"])

PS причина ошибки в том, что вы пытаетесь использовать не те названия метрик, которые вы задали. Класс NEPOCHLogger ожидает использование метрик: metrics=["mse", "mae"].

Answered by MaxU on January 1, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP