我正在尝试训练一个将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),输出是序列中第一个元素与每个元素之间的距离。
答案 0 :(得分:0)
您可以使用tf.where
和tf.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))))