[英]Choosing the right deep learning model in Keras
我面臨一個具有 4 個特征的實時問題: Vmean
、 Vmedian
、 Vnow
、 VV
。 我想做的是:
for i in range(len(X)):
model.fit(X[i], X[i+1])
model.predict(X[i+1])
也就是說,我試圖通過X[i+1]
和X[i]
預測X[i+2]
的值,因為一行與下一行相關,依此類推。 這是我的 model:
def kerasModel():
input_layer = keras.layers.Input(shape=(4, 1), name='input_shape')
x = keras.layers.LSTM(100, name='lstm_0')(input_layer)
x = keras.layers.Dropout(0.2, name='lstm_dropout')(x)
x = keras.layers.Dense(64, name='x2')(x)
output = keras.layers.Dense(4, activation='linear', name='x3')(x)
model = keras.Model(inputs=input_layer, outputs=output)
adam = keras.optimizers.Nadam(lr=0.005)
model.compile(optimizer=adam, loss='mse')
return model
但它不起作用。 它沒有像應該做的那樣預測下一個值。 我的問題是:是否有任何論文或規則可以根據您的特征做出好的深度學習 model? 另外,基於這個問題,哪個可能是一個好的 model?
我的問題是:是否有任何論文或規則可以根據您的特征做出好的深度學習 model?
據我所知,沒有這樣的“規則手冊”會告訴您在任何情況下使用哪種 model。 深度學習論文傾向於關注特定應用(圖片分類、分割、機器翻譯……),在這個子領域中,您會發現專門的架構往往對特定任務表現更好。
另外,基於這個問題,哪個可能是一個好的 model?
如果不詳細了解您的問題和數據等,就不可能回答這個問題......
值得深思的是“好”的含義。 如果您查看深度學習 model 在像 MNIST 這樣的數據集上隨時間推移的邊際性能改進,您會發現與更高級和更專業的架構相比,即使是“基線”MLP 也可以獲得可接受的錯誤率。
https://en.wikipedia.org/wiki/MNIST_database
因此,在跳到更高級的架構之前,我總是從一個小而簡單的 model 開始,以使代碼工作,然后我逐漸增加復雜性,只要它在值得花時間的指標上產生邊際改進。
但它不工作
首先:
as @emremrah said, your OP is not specific enough, but looking at your code I think the first problem comes from you using a function instead of sub-classing Keras Model
to define you model. Since you are calling the model inside a for loop each call to the function would yield a new model instead of fitting the existing model.
嘗試對 model 進行子類化並創建一個實例,如下例所示:
class Dense_Detector(Model):
def __init__(self, flight_len, param_len):
super(Dense_Detector, self).__init__()
self.input_dim = (flight_len, param_len)
self.encoder = tf.keras.Sequential([
layers.Flatten(),
layers.Dense(32, activation="relu"),
layers.Dense(16, activation="relu"),
layers.Dense(8, activation="relu")
])
self.decoder = tf.keras.Sequential([
layers.Dense(16, activation="relu"),
layers.Dense(32, activation="relu"),
layers.Dense(flight_len * param_len, activation="relu"),
layers.Reshape(self.input_dim)
])
def call(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded
model = Dense_Detector(flight_len, param_len, hidden_state=16)
optimizer = tf.keras.optimizers.Adam(clipvalue=1.0)
model.compile(optimizer=optimizer, loss=losses.MeanSquaredError())
第二
除非你有特定的理由這樣做,否則我不會在同一個循環中混合訓練和預測,因為它沒有意義。
培訓的目標是讓您的 model 調整其內部 state 以建立對您正在嘗試實現的任務的“理解”,在這種情況下,通過將其暴露於一系列示例(data, label)
來預測下一步。 希望在看到成百上千的數據后,它能夠正確分類看不見的數據。
您正在做的是在一個實例上訓練 model:
model.fit(X[i], X[i+1])
然后試圖預測下一個:
model.predict(X[i+1])
因此,基本上您希望 model 僅在查看一個實例后就對您的數據有所了解。
不幸的是,我不會給你一個“即插即用”的解決方案,但我希望這能幫助你更好地了解你的 model 以及你在做什么。
我的規則是制作基線,然后嘗試改進 model,清理或收集更多數據,玩訓練過程等。在您的情況下,基線可能是更簡單的時間序列多步密集 model 。
是否有任何論文或規則可以根據您的特征做出好的深度學習 model?
正如@yoan-bm-sc 已經提到的,model 選擇(更重要的是超參數選擇)沒有規則手冊。 這主要是直覺和大量的反復試驗。
但是你可以根據手頭的問題得到一些提示。 例如
這些都是提示,前面提到的最終解決方案來自直覺和反復試驗。
如果您要問“但是我想如何獲得這種直覺?” 我的建議是首先了解為什么要創建不同的架構。 例如,首先要了解為什么首先發明了 RNN。 或者通過了解 CNN 試圖解決什么樣的問題以及它們為什么起作用?
Jeff Hinton 的“機器學習神經網絡”和 Andrew Ng 的“機器學習”課程是一個很好的起點。
基於這個問題,這可能是一個好的 model?
如果您確定 X[i-1] 和 X[i-2] 有足夠的信息來預測 X[i],我建議放棄 LSTM 並使用簡單的前饋神經網絡(一堆密集層) .
即使您知道最后的“k”個元素不足以進行完美的預測,但可以創建一個很好的估計,在嘗試 LSTM 之前先嘗試一個簡單的神經網絡。 RNN 更復雜,需要更多的調整。
最后,請記住,“錯誤的型號選擇”並不是 model 無法正常工作的唯一原因。 原因可能是缺乏足夠的示例、初始化錯誤、輸入和輸出的錯誤歸一化等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.