Я нашел 2 решения поставленного вами вопроса.
- Вы можете передать свой входной тензор в качестве аргумента пользовательской функции оболочки потерь.
def custom_loss(i):
def loss(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1) + something with i...
return loss
def baseline_model():
# create model
i = Input(shape=(5,))
x = Dense(5, kernel_initializer='glorot_uniform', activation='linear')(i)
o = Dense(1, kernel_initializer='normal', activation='linear')(x)
model = Model(i, o)
model.compile(loss=custom_loss(i), optimizer=Adam(lr=0.0005))
return model
Это решение также упоминается в принятом ответе здесь
Вы можете дополнить свою метку дополнительными столбцами данных из ввода и записать пользовательские потери.Это полезно, если вы просто хотите, чтобы один / несколько столбцов функций были введены из вашего ввода.
def custom_loss(data, y_pred):
y_true = data[:, 0]
i = data[:, 1]
return K.mean(K.square(y_pred - y_true), axis=-1) + something with i...
def baseline_model():
# create model
i = Input(shape=(5,))
x = Dense(5, kernel_initializer='glorot_uniform', activation='linear')(i)
o = Dense(1, kernel_initializer='normal', activation='linear')(x)
model = Model(i, o)
model.compile(loss=custom_loss, optimizer=Adam(lr=0.0005))
return model
model.fit(X, np.append(Y_true, X[:, 0], axis =1), batch_size = batch_size, epochs=90, shuffle=True, verbose=1)
Это решение также можно найти здесь, в этой теме .
Я использовал 2-й метод, только когда мне пришлось использовать входные столбцы объектов в потере.Я использовал первый метод со скалярными аргументами;но я верю, что тензорный ввод тоже работает.