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])
Я думаю что колбек не отслеживает 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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP