簡體   English   中英

在 Keras 中選擇合適的深度學習 model

[英]Choosing the right deep learning model in Keras

我面臨一個具有 4 個特征的實時問題: VmeanVmedianVnowVV 我想做的是:

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。
  • 如果您的輸入要素彼此之間沒有時間或空間相關性,您可能應該使用普通的多層非線性神經網絡。

這些都是提示,前面提到的最終解決方案來自直覺和反復試驗。

如果您要問“但是我想如何獲得這種直覺?” 我的建議是首先了解為什么要創建不同的架構。 例如,首先要了解為什么首先發明了 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.

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