我有一个简单的顺序模型,使用TimeDistributed(Dense ...)作为LSTM层之后的最后一层。我按照20个时间步骤的顺序训练时间序列数据。损失函数是平均绝对误差,定义为:
def mean_absolute_error(y_true, y_pred):
return K.mean(K.abs(y_pred - y_true), axis=-1)
(来自https://github.com/fchollet/keras/blob/master/keras/losses.py)
该模型的片段是:
LSTM(
framelen
, return_sequences=True
)
TimeDistributed(
Dense(
framelen
, activation="relu"
)
)
正在馈送的数据具有大小(批次,时间步长,帧框),其中时间步长为20,如上所述,批次覆盖整个数据集,而framelen是13个参数,缩放为0 - 1.0。最终结果应该是一组预测序列中后续步骤的framelen参数。
我试图确认标准损失函数是否确实计算了输出中所有时间步长的损失。看看代码,看起来损失可能只是在一个时间步骤上计算,但这可能只是我对代码的不了解。
我试图用这个模型和等效物进行相同的训练,其中最后一层是一个普通的密集(显然每次都将预期的输出结构化为一个步骤)。普通密集模型的训练效果远远好于TimeDistributed等效模型。前者设法以较低的最小值收敛,定性输出更好。
当时间序列数据与TimeDistributed一起用作输出时,是否有人能够很好地了解损失函数的工作方式?它是否实现了输出中每个时间步的损失计算?如果是这样,它如何使用标量值的损失?
答案 0 :(得分:2)
他们的工作方式完全取决于他们如何定义。
最常见的是,张量中的所有元素都参与了损失函数。 如果在某些计算之前或之后对它们进行求和,则可能会改变它们的处理顺序。它们按轴分组(尺寸等于您的目标数据)。因此,计算的顺序(首先考虑哪个轴),以及它们的总和顺序以及取得平均结果的顺序。
在Keras中,最常见的是看它在张量的最后一个轴上计算子凹陷,然后它得到平均值或总和。
当您使用(samples, steps, featuresOrClasses)
形式的时间序列输出时,Keras'标准函数通常按featuresOrClasses
进行分组,然后计算总和和平均值。
例如,这对于分类问题是合乎逻辑的。如果您有3个输出类并且需要categorical_crossentropy
,则必须在每个时间步骤中单独计算此结果,仅考虑3个类。因此,计算最后一个轴(这是考虑3个类的唯一轴)的结果然后对步骤和样本求和是很好的。
但它还不足以告诉你为什么你的损失不同。这取决于您的目标是什么。他们是班级吗?他们是在预言一个系列吗?等
主要区别在于会有更多元素参与损失。适合所有人可能更难。