使用循环在tensorflow中创建自定义损失函数

使用循环在tensorflow中创建自定义损失函数,tensorflow,model,loss-function,Tensorflow,Model,Loss Function,我想使用y_true和y_pred为tensorflow模型创建一个自定义损失函数,但我得到以下错误: ValueError:无法从形状推断num(无,1) 这是我的自定义指标: def custom_metric(y_true,y_pred): y_true = float(y_true) y_pred = float(y_pred) y_true = tf.unstack(y_true) y_pred = tf.unstack(y_pred) sq

我想使用y_true和y_pred为tensorflow模型创建一个自定义损失函数,但我得到以下错误: ValueError:无法从形状推断num(无,1) 这是我的自定义指标:

def custom_metric(y_true,y_pred):

    y_true = float(y_true)
    y_pred = float(y_pred)
    y_true = tf.unstack(y_true)
    y_pred = tf.unstack(y_pred)

    sqr_pred_error = K.square(y_true - y_pred)
    sqr_y_true = K.square(y_true)
    r = []
    for i in y_true:
        if sqr_pred_error[i] < sqr_y_true[i] or sqr_pred_error[i] == sqr_y_true[i]:
            result = 1
            print("result: 1")
        else:
            result = 0
            print("result: 0")
        r.append(result)
    r = tf.stack(r)

    return  K.sum(r)/K.shape(r)
def自定义度量(y_真,y_pred):
y_真=浮动(y_真)
y_pred=浮动(y_pred)
y_true=tf.unstack(y_true)
y_pred=tf.unstack(y_pred)
sqr_pred_error=K.square(y_true-y_pred)
sqr_y_真=K平方(y_真)
r=[]
因为我是真的:
如果sqr_pred_error[i]
您可能不需要在其中设置循环。看起来你只需要一堆0和1


  • 1
    -如果
    sqr\u pred\u错误,当我将其用作度量时,它会起作用,但作为一种损失,我有以下消息错误:ValueError:没有为任何变量提供梯度:[“稠密/内核:0”,“稠密/偏差:0”,“稠密/内核:0”,“稠密/内核:0”,“稠密/内核:0”,“稠密/内核:0”,“稠密/偏差:0”]。有什么想法吗?@JasonGreffier,这很有道理。因为看看tf.where是如何运作的。它收集了一堆与预测本身无关的1和0。所以不会有梯度。我会看看,如果我尝试过的每件事都失败了,这件事是否能挽回损失,如果你成功了,让我来know@JasonGreffier是的,我还没有机会。今天我将试着看一看我没有看到你最后的评论。如果sqr_pred_出错,我将尝试它
    
    def custom_metric(y_true,y_pred):
    
        y_true = tf.cast(y_true, 'float32')
        y_pred = tf.cast(y_pred, 'float32')
        
        sqr_pred_error = K.square(y_true - y_pred)
        sqr_y_true = K.square(y_true)
    
        res = tf.where(sqr_pred_error<=sqr_y_true, tf.ones_like(y_true), tf.zeros_like(y_true))
        return  K.mean(res)