【问题标题】:Tensorflow dimension size / rank issue on loss function when training训练时损失函数的Tensorflow维度大小/排名问题
【发布时间】:2018-09-09 04:55:50
【问题描述】:

我有一个自定义的损失函数,它似乎是有效的(运行这两行时没有错误,如下所示)

alpha_cost = 2 cost = tf.reduce_mean(tf.where(tf.less(Y * out, 0), tf.squeeze((alpha_cost*out)**2 - tf.sign(Y)*out + tf.abs(Y)), tf.squeeze(tf.abs(Y - out))))

但是,当我实际继续进行模型训练(批量大小为 10,000)时,使用此损失函数会产生以下错误...

InvalidArgumentError(参见上面的回溯):操作的输入 Select_4 类型的 Select 必须具有相同的大小和形状。输入 0: [1,10000] != 输入 1:[10000] [[节点:Select_4 = Select[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](Less_7, Squeeze_6, Squeeze_7)]]

可能只是需要添加另一个 tf.squeeze 来压缩尺寸...但我尝试了几次,但并没有完全配合,所以这种方法可能存在更大的问题...谢谢求您的帮助!

【问题讨论】:

    标签: python tensorflow rank tensor loss-function


    【解决方案1】:

    使用 numpy 模块,

    import numpy as np
    

    和定义

    input0 = tf.where(tf.less(Y * out, 0)
    input1 = tf.squeeze((alpha_cost*out)**2 - tf.sign(Y)*out + tf.abs(Y))
    

    尝试将 input1 从 rank-1 数组重塑为行向量:

    input1 = np.reshape(input1, (1, 10000)) 
    

    赋予它与 input0 相同的形状。您可以断言 input1 具有正确的形状:

    assert(input1.shape == (1,10000)) 
    

    并检查 input0 和 input1 是否具有相同的尺寸:

    assert(input0.shape == input1.shape) 
    

    【讨论】:

    • 古斯塔夫大帝!谢谢,这种方法奏效了。我最终使用了轻微的变化,但思路相同: input0 = tf.squeeze(tf.less(Y * out, 0)) input1 = tf.squeeze((alpha_cost*out)**2 - tf.sign( Y)*out + tf.abs(Y)) input2 = tf.squeeze(tf.abs(Y - out)) cost = tf.reduce_mean(tf.where(input0, input1, input2))
    猜你喜欢
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2021-12-27
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多