首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >一种批量计算损失函数的有效方法?

一种批量计算损失函数的有效方法?
EN

Stack Overflow用户
提问于 2019-05-22 18:21:47
回答 1查看 374关注 0票数 1

我正在使用自动编码器进行异常检测。因此,我已经完成了对模型的训练,现在我想计算数据集中每个条目的重建损失。这样我就可以将异常分配给重建损失较高的数据点。

这是我当前计算重建损失的代码,但这真的很慢。据我估计,通过数据集应该需要5个小时,而训练一个时期大约需要55分钟。我觉得转换到张量运算是代码的瓶颈,但我找不到更好的方法来做到这一点。

我尝试过更改批处理大小,但没有太大区别。我必须使用转换为张量部分,因为如果我正常操作,K.eval会抛出错误。

python

代码语言:javascript
复制
 for i in range(0, encoded_dataset.shape[0], batch_size):    
    y_true = tf.convert_to_tensor(encoded_dataset[i:i+batch_size].values,
 np.float32)
     y_pred= tf.convert_to_tensor(ae1.predict(encoded_dataset[i:i+batch_size].values),
 np.float32)
    # Append the batch losses (numpy array) to the list
    reconstruction_loss_transaction.append(K.eval(loss_function( y_true, y_pred))) 

我能够在每个时代55分钟内训练。所以我觉得每次预测不应该花5个小时。encoded_dataset是一个变量,它将主内存中的整个数据集作为数据帧。我正在使用Azure VM实例。K.eval(loss_function(y_true,y_pred)将查找批处理中每一行的损失,因此y_true的大小为(batch_size,2000),y_pred K.eval(loss_function(y_true,y_pred)将给出以下输出

(batch_size,1)在y _true和y_pred

的每一行上计算二元交叉熵

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-28 02:25:08

摘自评论:

我怀疑ae1.predictK.eval(loss_function)的行为方式出人意料。与y_pred一样,通常也应该使用ae1.predict来输出损失函数值。在创建模型时,指定损失值是另一个输出(您可以有多个输出的列表),然后只需调用y_pred here一次,就可以在一次调用中同时获得损失值。

,但是我想知道每一行的损失。预测方法返回的损失不是整个批次的平均损失吗?

答案取决于损失函数是如何实现的。这两种方法在幕后的TF中都会产生完全有效和相同的结果。您可以在采用梯度w.r.t之前对批次的损失进行平均。损失,或采用梯度w.r.t。损失的向量。如果你使用后一种方法,TF中的梯度运算将为你执行损失的平均(参见SO articles on taking the per-sample gradient,实际上很难做到)。

如果Keras在损失中内置了reduce_mean来实现损失,那么您可以定义自己的损失。如果您使用的是平方损失,请将'mean_squared_error‘替换为λy_true,y_pred: tf.square(y_pred - y_true)。这将产生平方误差,而不是均方误差(与梯度没有区别),而是look here for the variant including the mean

在任何情况下,只要不使用tf.reduce_mean,这就会产生每个样本的损失,这在损失中是纯粹可选的。另一种选择是简单地计算损失,将其与您优化的内容分开,并使其成为模型的输出,也是完全有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56254620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档