努力获得具有多个附加输入且批量大小为1的简单自定义损失函数。
在下面的玩具示例中,我正在创建一个长度为n = 2的数据集,其中包含两个不同的输入和一个虚拟标签。 我想传递一个样本,其中将两个输入都包含到我想要处理它们的自定义损失函数中(因此批大小= 1)。
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D, Input
from tensorflow.keras import Model
import tensorflow.keras.backend as kb
shape = (3,3)
x1 = tf.ones(shape) * 2 + tf.random.uniform(shape, -0.1, 0.1)
x2 = tf.ones(shape) * 3 + tf.random.uniform(shape, -0.1, 0.1)
y1 = tf.ones(shape)
y2 = tf.ones(shape)
# these inputs don't work
labels = tf.stack([[1/2], [1/3]])
in1_data = tf.stack([x1, x2])
in2_data = tf.stack([y1, y2])
# these inputs work (since label is a scalar and gets broadcasted?)
# labels = tf.stack([[1/2]])
# in1_data = tf.stack([x1])
# in2_data = tf.stack([y1])
def custom_loss_wrapper(in1, in2):
def custom_loss(y_true, y_pred):
# the problem is here
out1 = in1 * y_pred
return tf.keras.losses.mean_squared_error(out1, in2)
return custom_loss
in1 = Input(shape=(3,3),name='in1')
in2 = Input(shape=(3,3),name='in2')
x = Flatten()(in1)
x = Dense(3, activation='relu')(x)
y = Dense(1, activation='sigmoid')(x)
model = Model(inputs=[in1, in2], outputs=y)
model.summary()
model.compile(optimizer='rmsprop',
loss=custom_loss_wrapper(in1, in2))
model.fit([in1_data, in2_data], labels, batch_size=1, steps_per_epoch=10)
我遇到了错误:
InvalidArgumentError: Incompatible shapes: [2,1] vs. [2,3,3]
[[{{node loss_26/dense_120_loss/mul}}]]
这意味着我的损失函数正在接收两个样本,而不仅仅是一个样本,但不知道我在做什么错。丢失功能也无法打印。