Python 详细制作Keras中的自定义损耗函数

Python 详细制作Keras中的自定义损耗函数,python,neural-network,keras,Python,Neural Network,Keras,我尝试在Keras中创建一个自定义损失函数 我想做这个损失函数 输出的维度是80。批量为5000 我在下面建立了这个损失函数。但这不起作用 def normalize_activation(y_true, y_pred): nb_divide = K.reshape(K.sqrt(K.sum(K.square(y_pred), axis=1)),(5000, 1)) nb_divide=numpy.tile(nb_divide,80) predicted=numpy.d

我尝试在Keras中创建一个自定义损失函数

我想做这个损失函数

输出的维度是80。批量为5000

我在下面建立了这个损失函数。但这不起作用

def normalize_activation(y_true, y_pred):
    nb_divide = K.reshape(K.sqrt(K.sum(K.square(y_pred), axis=1)),(5000, 1))
    nb_divide=numpy.tile(nb_divide,80)
    predicted=numpy.divide(y_pred,nb_divide)
    return K.sum(K.square(y_true-predicted)) 
ValueError:使用序列设置数组元素

发生此错误。我认为y_的形状是真的,y_pred是(5000,80)


我应该在哪里修复它呢?

丢失函数应该避免所有类型的非源操作。这些值是张量,必须像张量一样保持它们

你不需要重塑事物,除非你真的希望它们以特定的方式表现

如果您有形状(5000,80)和(5000,1),则可以使用它们进行操作,而无需
K.repeat_elements()
(相当于numpy.tile)

因此,假设5000是批量大小(样本数量),80是属于样本的唯一实际尺寸:

def normalize_loss(yTrue,yPred):
    nb_divide = K.sqrt(K.sum(K.square(yPred),axis=1,keepdims=True)) 
        #keepdims=True keeps the shape like (5000,1)
        #this is not summing the entire batch, but only a single sample, is that correct?

    predicted = yPred/nb_divide
    return K.sum(K.square(yTrue-predicted))

一些意见:

  • (我不是损失函数专家)你只划分预测部分,而不是真实部分。这不会在两个值之间产生巨大差异,并导致误导损失函数吗?(再说一遍,我不是这里的专家)

  • 通常人们在损失函数的末尾使用
    K.mean()
    ,但我看到您使用了
    K.sum()
    。这不是一个问题,也不会妨碍培训工作。但是,您可能希望为不同大小的数据可视化相同的损失函数,并能够独立地比较它们的大小


丢失功能应避免所有非源操作。这些值是张量,必须像张量一样保持它们

你不需要重塑事物,除非你真的希望它们以特定的方式表现

如果您有形状(5000,80)和(5000,1),则可以使用它们进行操作,而无需
K.repeat_elements()
(相当于numpy.tile)

因此,假设5000是批量大小(样本数量),80是属于样本的唯一实际尺寸:

def normalize_loss(yTrue,yPred):
    nb_divide = K.sqrt(K.sum(K.square(yPred),axis=1,keepdims=True)) 
        #keepdims=True keeps the shape like (5000,1)
        #this is not summing the entire batch, but only a single sample, is that correct?

    predicted = yPred/nb_divide
    return K.sum(K.square(yTrue-predicted))

一些意见:

  • (我不是损失函数专家)你只划分预测部分,而不是真实部分。这不会在两个值之间产生巨大差异,并导致误导损失函数吗?(再说一遍,我不是这里的专家)

  • 通常人们在损失函数的末尾使用
    K.mean()
    ,但我看到您使用了
    K.sum()
    。这不是一个问题,也不会妨碍培训工作。但是,您可能希望为不同大小的数据可视化相同的损失函数,并能够独立地比较它们的大小


这相当于使用
损耗。均方误差(y\u true,K.l2\u normalize(y\u pred,axis=-1))
。或者您可以在模型末尾添加
Lambda(Lambda x:K.l2\u normalize(x,axis=-1))
层,并使用
loss='mse'
@Yu Yang非常感谢!使用lambda时,最后一个链接中的权重应为1。我来不了。所以我用的是你的第一个解决方案。非常感谢。但我想知道axis=-1的含义。我知道axis=0,axis=1。
axis=-1
只是“最后一个轴”,在这种情况下它将等同于
axis=1
,因此您可以使用其中任何一个。它将等同于使用
损耗。均方误差(y_true,K.l2_normalize(y_pred,axis=-1))
。或者您可以添加
Lambda(Lambda x:K.l2_normalize(x,axis=-1))
在模型末尾添加图层,并使用
loss='mse'
@Yu-Yang非常感谢!使用lambda时,最后一个链接中的权重应为1。我来不了。所以我用的是你的第一个解决方案。非常感谢。但我想知道axis=-1的含义。我知道axis=0,axis=1。
axis=-1
只是“最后一个轴”,在这种情况下,它将等效于
axis=1
,因此您可以使用任何一个。