我创建了一个具有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>