对于您提出的问题,我遇到了 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
the accepted answer here中也提到了这个解决方案
- 您可以使用输入中的额外数据列填充标签并编写自定义损失。如果您只需要输入中的一个/几个特征列,这将很有帮助。
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)
这个解决方案也可以在这里找到thread。
当我不得不在损失中使用输入特征列时,我只使用了第二种方法。我使用了带有标量参数的第一种方法;但我相信张量输入也可以。