簡體   English   中英

簡單的回歸神經網絡輸入形狀

[英]Simple Recurrent Neural Network input shape

我試圖用keras編寫一個非常簡單的RNN示例,但結果並不像預期的那樣。

我的X_train是一個長度為6000的重復列表,如:1,0,0,0,0,0,1,0,0,0 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...

我將其格式化為: (6000, 1, 1)

我的y_train是一個長度為6000的重復列表,如:1,0.8,0.6,0,0,0,1,0.8,0.6,0 1, 0.8, 0.6, 0, 0, 0, 1, 0.8, 0.6, 0, ...

我將其格式化為: (6000, 1)

根據我的理解,遞歸神經網絡應該學會正確地預測0.8和0.6,因為它可以記住兩個時間段前X_train中的1。

我的模特:

model=Sequential()
model.add(SimpleRNN(input_dim=1, output_dim=50))
model.add(Dense(output_dim=1, activation = "sigmoid"))
model.compile(loss="mse", optimizer="rmsprop")
model.fit(X_train, y_train, nb_epoch=10, batch_size=32)

該模型可以成功訓練,損失最小〜0.1015但結果不如預期。

test case ---------------------------------------------  model result -------------expected result 

model.predict(np.array([[[1]]])) --------------------0.9825--------------------1

model.predict(np.array([[[1],[0]]])) ----------------0.2081--------------------0.8

model.predict(np.array([[[1],[0],[0]]])) ------------0.2778 -------------------0.6

model.predict(np.array([[[1],[0],[0],[0]]]))---------0.3186--------------------0

我在這里有什么誤解嗎?

輸入格式應該是三維的:三個組件代表樣本大小,時間步數和輸出維度

一旦適當地重新格式化,RNN確實能夠很好地預測目標序列。

np.random.seed(1337)

sample_size = 256
x_seed = [1, 0, 0, 0, 0, 0]
y_seed = [1, 0.8, 0.6, 0, 0, 0]

x_train = np.array([[x_seed] * sample_size]).reshape(sample_size,len(x_seed),1)
y_train = np.array([[y_seed]*sample_size]).reshape(sample_size,len(y_seed),1)

model=Sequential()
model.add(SimpleRNN(input_dim  =  1, output_dim = 50, return_sequences = True))
model.add(TimeDistributed(Dense(output_dim = 1, activation  =  "sigmoid")))
model.compile(loss = "mse", optimizer = "rmsprop")
model.fit(x_train, y_train, nb_epoch = 10, batch_size = 32)

print(model.predict(np.array([[[1],[0],[0],[0],[0],[0]]])))
#[[[ 0.87810659]
#[ 0.80646527]
#[ 0.61600274]
#[ 0.01652312]
#[ 0.00930419]
#[ 0.01328572]]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM