2017-10-05 72 views
1

我想将欧几里得距离设置为LSTM或RNN的损失函数。RNN(keras)的欧几里德距离损失函数

这样的函数应该有什么输出: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?

回答

2

甲损耗函数将预测的和真实的标签和将输出一个标量,在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),你可能需要使用TimeDistributedwrapper,每个时间切片应用Dense,并调整完全连接层中隐藏单元的数量。