Я пытаюсь построить собственную функцию потерь для последовательной модели. В этой функции потерь y_true и y_pred используются для вычисления ошибки. Когда я пытаюсь заменить тензор y_true, поэтому все истинные значения из модели внешними истинными значениями, которые должны быть одинаковыми, я получаю разные результаты (примерно половину ожидаемых значений). Чтобы было понятнее, вот часть моего кода, который работает:
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import tensorflow as tf
from tensorflow import keras
def custom_loss(y_true, y_pred):
loss = tf.square(y_pred - y_true) + tf.square(y_pred - y_true)
return loss
model = Sequential()
model.add(Dense(5, input_dim=4, activation='tanh', use_bias=True)) # 1
model.add(Dense(5, activation='tanh')) # 2
model.add(Dense(5, activation='tanh')) # 3
model.add(Dense(5, activation='tanh')) # 4
model.add(Dense(5, activation='tanh')) # 5
model.add(Dense(1))
model.compile(loss=custom_loss, optimizer='adam', metrics=['accuracy'])
Когда я сейчас пытаюсь заменить одну из y_true
внешней переменной, преобразованной в тензор, я не получаю тех же результатов. input_scaled
- это тот же массив numpy, который также используется в model.fit
, поэтому я ожидал, что эти две пользовательские функции потерь будут давать одинаковый результат.
input_as_tensor = tf.convert_to_tensor(np.float32(input_scaled))
def custom_loss(y_true, y_pred):
loss = tf.square(y_pred - y_true) + tf.square(y_pred - input_as_tensor)
return loss
# ...as above...
hist = model.fit(input_to_fit, input_scaled, epochs=300, callbacks=[tensorboard_callback], validation_split=0.2)
Я использую версию TensorFlow: 2.0.0. Любая идея объяснить разницу будет оценена.
Изменить: Я обнаружил, что Keras обрабатывает мои входные данные со стандартным размером пакета 32, и поэтому существует несоответствие размеров между моим input_as_tensor
и y_true
, который имеет другой размер. Мне нужно выяснить, как вычесть правильные значения из моего input_as_tensor
.