如何忽略Keras中部分输入和输出?

时间:2018-11-08 21:41:31

标签: python machine-learning keras conv-neural-network loss-function

我正在尝试训练一个将n个值作为输入并输出n个值的模型。问题是n可以是1到700。所以我建立了一个网络,输入为700,输出为700。额外的输入和输出设置为零。 在训练模型时,我不在乎额外输出是否准确。因此,我尝试如下定义自己的损失函数:

def mse_truncate(y_true, y_pred):
    def fn(x):
        return tf.cond(x < 0.01,lambda: 0.0,lambda: 1.0)
    #Ignore the square error if y_true[i] is near zero
    sgn = tf.map_fn(fn,y_true)
    return K.mean(sgn * K.square(y_true-y_pred),axis=-1)

此功能在控制台上有效。 但是当我编译模型时,出现错误:

model.compile(optimizer='sgd',loss=mse_truncate, metrics=['accuracy'])
ValueError: Shape must be rank 0 but is rank 1 for 'loss_5/dense_2_loss/map/while/cond/Switch' (op: 'Switch') with input shapes: [?], [?].

有人可以告诉我这是怎么回事吗? 还是有更好的方法来处理可变长度的输入和输出?

注意: 关于这个问题的更多信息,输入是一个序列(长度<= 700),输出是序列中第一个元素与每个元素之间的距离。

1 个答案:

答案 0 :(得分:0)

您可以使用tf.wheretf.gather仅考虑您关心的那些值,例如:

indices = tf.where(tf.greater(y_true, 0.01)) #  or `tf.less`, `tf.equal` etc.
loss = K.mean(K.square(tf.gather(y_true, indices) - tf.gather(y_pred, indices))))