我想将欧几里德距离设置为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上平均损失吗?
答案 0 :(得分:5)
损失函数将采用预测和真实标签,并将输出标量,在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
,并调整数量完全连接层中的隐藏单元。