我正在使用Keras实现一个LSTM
模型。我对序列进行了填充以达到一定长度,以便正确地将数据集输入模型。
目前,我的模型如下:
model = tf.keras.Sequential()model.add(Masking(mask_value=0., input_shape=(timesteps, features)))model.add(LSTM(units=100, return_sequences=True, input_shape=(timesteps, features)))model.add(Dropout(0.5))model.add(Dense(1, activation='sigmoid'))
Keras是否会自动跳过损失函数中掩码值的标签?
回答:
是的,如果你的模型使用了掩码,那么目标函数(即损失函数)会自动调整以支持掩码,从而在计算损失时忽略被掩码的样本/时间步。实际上,weighted_masked_objective
是实现这一功能的后台函数:
def weighted_masked_objective(fn): """为目标函数添加掩码和样本加权支持。 它将一个目标函数 `fn(y_true, y_pred)` 转换为带样本加权和成本掩码的目标函数 `fn(y_true, y_pred, weights, mask)`。 # 参数 fn: 要包装的目标函数, 其签名为 `fn(y_true, y_pred)`。 # 返回 签名为 `fn(y_true, y_pred, weights, mask)` 的函数。 """ if fn is None: return None def weighted(y_true, y_pred, weights, mask=None): """包装函数。 # 参数 y_true: `fn` 的 `y_true` 参数。 y_pred: `fn` 的 `y_pred` 参数。 weights: 权重张量。 mask: 掩码张量。 # 返回 标量张量。 """ # score_array 的维度 >= 2 score_array = fn(y_true, y_pred) if mask is not None: # 将掩码转换为 floatX 以避免在 Theano 中进行 float64 上行转换 mask = K.cast(mask, K.floatx()) # 掩码应与 score_array 形状相同 score_array *= mask # 每批次的损失应与未掩码样本的数量成比例 score_array /= K.mean(mask) + K.epsilon() # 应用样本加权 if weights is not None: # 将 score_array 降维至与权重数组相同的维度 ndim = K.ndim(score_array) weight_ndim = K.ndim(weights) score_array = K.mean(score_array, axis=list(range(weight_ndim, ndim))) score_array *= weights score_array /= K.mean(K.cast(K.not_equal(weights, 0), K.floatx())) return K.mean(score_array) return weighted