自定义损失函数,在TF 2.0中具有多个附加输入

时间:2020-04-25 23:19:38

标签: python tensorflow tensorflow2.0

努力获得具有多个附加输入且批量大小为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}}]]

这意味着我的损失函数正在接收两个样本,而不仅仅是一个样本,但不知道我在做什么错。丢失功能也无法打印。

0 个答案:

没有答案