1

之間的差異我有2個模型就是我2點基本相同的數據集自制訓練。一個與序列長度1和一個與序列長度2.在它conveges像一個魅力和practicaly第一種情況下計算出我的產生過程,它比較好一點的機會的第二種情況。我做錯了什麼?任何事情都可能有幫助。Keras順序timedistributed模型極值結果2個3序列

數據生成代碼

def make_other_date(samples = 720,sequence = 1, features =100): 
    y_train = np.zeros((samples,sequence, 2)) 
    x_train = np.random.randint(2, size=(samples, sequence, features)) 
    for i_sample in range(samples): 
     for i_sequence in range(sequence): 

       if np.sum(x_train[i_sample,i_sequence,:]) > 50: 

        y_train[i_sample,:,:] = np.array([0,1]) 
       else: 
        y_train[i_sample,:,:] = np.array([1,0]) 


    return x_train-0.5,y_train #-0.5 to make mean = 0 

nsequence = 1 
x_train, y_train = make_other_date(36000,sequence = nsequence) 
x_val, y_val = make_other_date(360,sequence = nsequence) 
print(x_train.shape,y_train.shape)#(36000, 1, 100) (36000, 1, 2) 

模型

model = Sequential() 
model.add(TimeDistributed(Dense(10), batch_input_shape=(None,nsequence,100))) 
model.add(TimeDistributed(Dense(10))) #unnessacery 
model.add(TimeDistributed(Dense(2))) 
model.add(Activation('softmax')) 
model.compile(loss='categorical_crossentropy', optimizer='adam') 
print (model.output_shape) #(None, 1, 2) 

結果nsequence = 1

Epoch 10/10 
28800/28800 [==============================] - 3s - loss: 3.4264e-05 - val_loss: 2.4744e-05 

結果nsequence = 2

Epoch 10/10 
28800/28800 [==============================] - 3s - loss: 0.6053 - val_loss: 0.6042 

回答

1

也有一些是錯誤的問題的提法。我會試着向你解釋爲什麼你的例子不能工作,然後如果你願意,你可以創建另一個例子。

在數據部分,當你生產數據集:

for i_sequence in range(sequence): 
    if np.sum(x_train[i_sample,i_sequence,:]) > 50: 
     y_train[i_sample,:,:] = np.array([0,1]) 
    else: 
     y_train[i_sample,:,:] = np.array([1,0]) 

你只定義了基於該序列的最後一個元素上的整個序列目標。該y_train[i_sample,0,:]將通過循環的最後一個動作,因爲你更新y_train[i_sample,:,:]每次你前進的順序被覆蓋。

所以:你有一個目標的整個序列,這取決於只有這個序列的最後一個元素上。

現在在模型部分:

你的模型只constitued的TimeDistributed(Dense())層。按照definition,這是適用您的序列中的每個元素在同一緻密層的包裝。那些密集的圖層共享權重,因此將應用於序列的第一個元素上的那個與完全相同。

現在,如果你仔細想想:決定以應用序列的第一個元素的目標,你的網絡需要知道發生了什麼的最後一個元素上,因爲你這樣定義的數據集。

想象您的序列的一個-call它seq_i-使得

np.sum(x_train[seq_i,0,:]) = 52 
np.sum(x_train[seq_i,1,:]) = 49 

那麼你的該序列是靶

y_train[seq_i,0] = [1,0] 
y_train[seq_i,1] = [1,0] 

假設緻密層能夠預測目標[1,0]的如果輸入是< 50,就像你想要它爲序列的第二個元素一樣。由於您將同一圖層應用於序列的第一個元素,因此它會預測該元素的[0,1]並在訓練階段受到懲罰。它會來回走動,不會學到任何東西。

是否清楚?

+0

是的,我想我明白謝謝你。我的目標是在每個'i_sequence'上改變它,然後我(我理解它的方式)不需要模型的遞歸函數。當然,現在我有這個我想把它改爲'i_sequence-1',然後我需要經常性函數。然而,我測試了它,你的權利非常感謝你! – NeoTT