数值变量和分类变量的自定义损失函数keras



我创建了一个具有5个特征的数据集的自动编码器模型。
从这些特征中,前3个是数值特征,后2个是二元分类特征。我想做的是创建一个自定义的损失函数,它考虑了这两种类型的数据。我试过的:

def custom_loss(y_true, y_pred):
return tf.math.add(
tf.keras.metrics.mean_squared_error(y_true[:,0:3], y_pred[:,0:3]) + 
tf.keras.metrics.BinaryCrossentropy(y_true[:,3:5], y_pred[:,3:5])
)

然而,这会给我这个错误:

OperatorNotAllowedInGraphError: using a `tf.Tensor` as a Python `bool` is not allowed: AutoGraph did convert this function. This might indicate you are trying to use an unsupported feature.

如果没有tf.math.add(),这也不能工作。

自定义损耗在这里给出:

autoencoder.compile(optimizer='adam', loss = custom_loss)

这是如何实现的?

你的损失函数实现中有一个问题。尝试如下

def custom_loss(y_true, y_pred):
return tf.math.add(
tf.keras.losses.mean_squared_error(y_true[:,0:3], y_pred[:,0:3]), 
tf.keras.losses.binary_crossentropy(y_true[:,0:3], y_pred[:,0:3])
)

注,BinaryCrossentropy为类,binary_crossentropy为函数。下面是一个虚拟的例子

# data 
img = tf.random.normal([20, 32], 0, 1, tf.float32)
tar = np.random.randint(2, size=(20, 1))
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
def custom_loss(y_true, y_pred):
return tf.math.add(
tf.keras.losses.mean_squared_error(y_true[:,0:3], y_pred[:,0:3]), 
tf.keras.losses.binary_crossentropy(y_true[:,0:3], y_pred[:,0:3])
)
model.compile(loss=custom_loss, 
optimizer='adam', metrics=['accuracy'])
model.fit(img, tar, epochs=2, verbose=2)
Epoch 1/2
1/1 - 1s - loss: 1.4021 - accuracy: 0.4000 - 550ms/epoch - 550ms/step
Epoch 2/2
1/1 - 0s - loss: 1.3967 - accuracy: 0.4500 - 8ms/epoch - 8ms/step
<keras.callbacks.History at 0x7f9c40880790>

相关内容

  • 没有找到相关文章

最新更新