Можно ли сделать специальную функцию потерь регрессии в keras, учитывая предыдущий результат?Python

Программы на Python
Anonymous
Можно ли сделать специальную функцию потерь регрессии в keras, учитывая предыдущий результат?

Сообщение Anonymous »


Я создаю модель регрессии изображений CNN. Я хочу добавить в функцию потерь штрафной член, чтобы наказывать, если текущий прогноз превышает предыдущее ожидание.

Есть ли способ написать код, используя Keras вместо использования tf.GradientTape()?

(Эта тема похожа на то, что я хочу спросить Пользовательская функция потерь с помощью Gradient Tape, TF2.6)

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

Поэтому метка изображения должна уменьшаться как можно ближе к ненормальной метке. (Например, метка ненормального будет 0, а предыдущее изображение будет 1, а два предыдущих изображения будут меткой 2.)

Итак, мой прогноз также уменьшается, и я хочу назначить штрафной срок, если текущий прогноз превышает предыдущий.

Вот код архитектуры модели. Я использовал предварительно обученную модель VGG16 и адаптировал ее как модель регрессии.

initial_model = tf.keras.applications.VGG16(weights = 'imagenet',include_top = False) Initial_model.trainable = Ложь func_model_p = keras.Sequential() входы = keras.Input(форма = (700,100,3)) func_model_p.add (входные данные) func_model_p.add(keras.layers.GlobalAveragePooling2D()) func_model_p.add(keras.layers.Dense(1, active="linear")) # Подготовьте показатели. train_mse_metric_p = keras.metrics.MeanSquaredError() val_mse_metric_p = keras.metrics.MeanSquaredError() Этот код предназначен для tf.GradientTape. Я хочу изменить этот код для Keras.
для e в диапазоне (эпохах): для меня в диапазоне (len(y_train_d_noshuffle)): с tf.GradientTape() в качестве ленты: изображение = np.expand_dims(X_train_d_noshuffle, axis=0) y_hat = func_model_p (изображение, обучение = True) предыдущее_значение = предыдущий_список[-1] нарушение_терм = tf.constant(max( (y_hat - previous_value) , 0), dtype=tf.float32) пытаться: если y_train_d_noshuffle < y_train_d_noshuffle[i+1]: нарушение_терм = 0 кроме: пройти y_train_c = tf.constant(y_train_d_noshuffle) mse = tf.keras.losses.MeanSquaredError()(y_train_c, y_hat) # подсчитываем потери значение_потерь = mse + термин_нарушение предыдущий_список.append(y_hat) train_mse_sum = train_mse_sum + mse train_penalty_sum = train_penalty_sum + нарушение_срок grads = Tape.gradient(loss_value, func_model_p.trainable_weights) оптимизатор.apply_gradients(zip(grads, func_model_p.trainable_weights)) # Обновить метрику обучения. train_mse_metric_p.update_state(y_train_d_noshuffle, y_hat) # Отображение показателей в конце каждой эпохи. train_mse = train_mse_metric_p.result().numpy() print(f'epochs: {e}, train_mse_sum: {train_mse_sum}, train_penalty_sum: {float(train_penalty_sum)}') ``` Пожалуйста, дайте мне знать, если вы знаете дорогу! Заранее спасибо!

Вернуться в «Python»