2017-10-05 253 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,並調整完全連接層中隱藏單元的數量。