Keras LSTM和x2B的损失计算;时间分布(密集…)层

Keras LSTM和x2B的损失计算;时间分布(密集…)层,keras,Keras,我有一个简单的顺序模型,使用时间分布(稠密…)作为LSTM层之后的最后一层。我正在培训20个时间步序列的时间序列数据。损失函数为平均绝对误差,定义为: def mean_absolute_error(y_true, y_pred): return K.mean(K.abs(y_pred - y_true), axis=-1) (来自) 模型的一个片段是: LSTM( framelen , return_sequences=True ) TimeDistributed(

我有一个简单的顺序模型,使用时间分布(稠密…)作为LSTM层之后的最后一层。我正在培训20个时间步序列的时间序列数据。损失函数为平均绝对误差,定义为:

def mean_absolute_error(y_true, y_pred):
  return K.mean(K.abs(y_pred - y_true), axis=-1)
(来自)

模型的一个片段是:

LSTM(
    framelen
    , return_sequences=True
)
TimeDistributed(
    Dense(
        framelen
        , activation="relu"
    )
)
正在输入的数据具有一定的大小(批次、时间步长、framelen),其中时间步长如前所述为20,批次覆盖整个数据集,framelen是13个参数,比例为0-1.0。最终结果应该是一组framelen参数,用于预测序列中的下一步

我试图确认标准损耗函数是否实际计算了输出中所有时间步长的损耗。看看代码,看起来损失可能只是在一个时间步长上计算出来的,但这可能只是我对代码的理解不够

我尝试使用此模型和等效模型运行相同的训练,其中最后一层是一个简单的密集层(显然每次都将预期输出结构化为一个步骤)。平原密集模型似乎比时间分布等效模型训练得更好。前者设法收敛到一个较低的最小值,定性输出要好得多


当使用时间序列数据和TimeDistributed作为输出时,有人对损失函数的工作方式有很好的了解吗?它是否实现了输出中每个时间步长的损耗计算?如果是这样,它如何使用标量值的损失呢?

它们的工作方式完全取决于它们的定义方式

通常,张量中的所有元素都参与损失函数。 如果在某些计算之前或之后对它们求和,则可能会改变它们的处理顺序。它们按轴分组(尺寸等于目标数据)。因此,计算的顺序(首先考虑哪个轴),以及它们的求和顺序,以及取平均结果的顺序

在Keras中,最常见的方法是计算张量最后一个轴上的子间隙,然后求平均值或和

当您以
(示例、步骤、特征或类)
的形式处理时间序列输出时,Keras的标准函数通常会按
特征或类进行分组,然后计算总和和平均值

例如,对于分类问题来说,这是合乎逻辑的。如果您有3个输出类,并且需要一个
分类的交叉熵
,则必须在每个时间步中单独计算此结果,仅考虑3个类。因此,可以在最后一个轴上计算结果(这是唯一考虑3个类的轴),然后对步骤和样本求和

但这还不足以告诉你为什么你的损失不同。这取决于你的目标是什么。他们在上课吗?他们是在预言一系列事件吗?等等


主要区别在于,将有更多的要素参与损失。要把所有这些都放进去可能更难

感谢您的深入回复。根据您对自定义损失问题的回答:以及您在此处的回答,在我看来,标准的Keras平均绝对损失定义(我将编辑我的问题以包括此代码)在最终LSTM正在执行
return\u sequences=True
(然后通过时间分布密集层)的情况下不起作用,因为唯一的损失将根据时间序列中的最终结果进行计算。为了获得步进损耗测量所需的等效效果,我需要在损耗函数上更新轴=1,它将考虑所有的步骤。但按最后一个轴分组。这意味着所有步骤都将被视为不同的示例。(但是有很多步骤会增加样本的数量)。我不确定我是否理解。以下是我从你的评论中领会到的。将13个参数中的20个步骤输入LSTM,返回_序列=真,将返回20个步骤x 13个参数作为预测。损失将只看这些步骤中的最后一步(结果[19],有13个元素),然后在其余步骤[0:19]中应用相同的损失,而不计算它们自己的损失?如果是这样,那不是我想要的!否,它将为每个步骤计算一个损耗,在每个步骤损耗中分组13个参数。然后求和并平均所有这些阶跃损失。尽管存在适用于
平均值
函数的
轴=-1
,但计算是使用张量中的所有值完成的。考虑到剩下的轴线,Keras将在稍后的某个时候做出一个平均值。