我尝试在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_true,y_pred的形状是(5000,80)。
我应该在哪里修理它?
答案 0 :(得分:2)
损失函数应该避免不属于keras backend的所有类型的操作。这些值是张量,你必须像张量一样保持它们。
除非你真的希望他们以特定的方式行事,否则你不需要重塑形状。
如果你有形状(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()
。这不是问题,也不能阻止培训工作。但是您可能希望将这种相同的损失函数可视化为具有不同大小的数据,并且能够独立地比较它们的大小。