首页 文章

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

提问于
浏览
1

我想将欧几里德距离设置为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)

那么,我应该在时间步长维度和/或batch_size上平均丢失吗?

1 回答

  • 3

    在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 作为输入 . 损失计算遵循前向传播步骤,并且它的值提供了与真实标签相比的预测标签的良好性 .

    此函数应具有哪些输出:float,(batch_size)或(batch_size,timesteps)?

    损失函数应具有标量输出 .

    那么,我应该在时间步长维度和/或batch_size上平均丢失吗?

    这不需要能够使用欧几里德距离作为损失函数 .

    旁注:在您的情况下,我认为问题可能在于神经网络架构,而不是损失 . 给定 (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 ,并调整完全连接层中隐藏单元的数量 .

相关问题