RNN(keras)的欧几里得距离损失函数

3

我希望为LSTM或RNN设置欧几里得距离作为损失函数。

这样的函数应该具有什么输出:float,(batch_size)还是(batch_size,timesteps)?

模型输入X_train的维度为(n_samples,timesteps,data_dim)。Y_train具有相同的维度。

示例代码:

def euc_dist_keras(x, y):
    return K.sqrt(K.sum(K.square(x - y), axis=-1, keepdims=True))


model = Sequential()
model.add(SimpleRNN(n_units, activation='relu', input_shape=(timesteps, data_dim), return_sequences=True))
model.add(Dense(n_output, activation='linear'))

model.compile(loss=euc_dist_keras, optimizer='adagrad')

model.fit(y_train, y_train, batch_size=512, epochs=10)

所以,我应该对时间步维度和/或批次大小进行平均损失吗?
1个回答

6

损失函数将接收预测标签和真实标签,并输出一个标量,在Keras中:

from keras import backend as K 
def euc_dist_keras(y_true, y_pred):
    return K.sqrt(K.sum(K.square(y_true - y_pred), axis=-1, keepdims=True))

请注意,它不会将X_train作为输入。损失计算遵循前向传播步骤,并且其值提供了预测标签与真实标签相比的好坏程度。
这个损失函数应该具有标量输出。
因此,不需要在时间步维度和/或批次大小上平均损失,才能使用欧几里得距离作为损失函数。

顺便提一下:在您的情况下,我认为问题可能在于神经网络的架构,而不是损失。给定(batch_size,timesteps,data_dim)SimpleRNN的输出将是(batch_size,timesteps,n_units)Dense层的输出将是(batch_size,n_output)。因此,如果您的Y_train的形状为(batch_size,timesteps,data_dim),您可能需要使用TimeDistributed wrapper 每个时间片应用Dense,并调整全连接层中隐藏单元的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接