在 Keras 中选择正确的深度学习模型

Oma*_*mar -3 python deep-learning keras tensorflow

我正面临一个实时问题,它有 4 个特征: Vmean, Vmedian, Vnow, VV。我想要做的是:

for i in range(len(X)):
     model.fit(X[i], X[i+1])
     model.predict(X[i+1])
Run Code Online (Sandbox Code Playgroud)

也就是说,我试图预测X[i+2]throughX[i+1]和的值X[i],因为一行与下一行相关,依此类推。这是我的模型:

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

Run Code Online (Sandbox Code Playgroud)

但它不起作用。它没有像它应该做的那样预测下一个值。我的问题是:是否有任何论文或规则可以根据您的特征制作一个好的深度学习模型?另外,基于这个问题,哪个可能是一个好的模型?

Yoa*_*.Sc 5

我的问题是:是否有任何论文或规则可以根据您的特征制作一个好的深度学习模型?

据我所知,没有这样的“规则书”会告诉你在任何情况下使用什么样的模型。深度学习论文往往侧重于特定应用(图片分类、分割、机器翻译等),在这个子领域中,您会发现专门的架构往往对特定任务表现更好。

另外,基于这个问题,哪个可能是一个好的模型?

如果不详细了解您的问题和数据等,就无法回答这个问题......

值得思考的事情是“好”的含义。如果您在像 MNIST 这样的数据集上查看深度学习模型随时间的边际性能改进,您会发现与更高级和更专业的架构相比,即使是“基线”MLP 也可以获得可接受的错误率。

在此处输入图片说明 https://en.wikipedia.org/wiki/MNIST_database

所以,在跳到更高级的架构之前,我总是从一个小而简单的模型开始,让代码工作,然后我逐渐增加复杂性,只要它产生值得花时间的指标的边际改进。

但它不起作用

第一

正如@emremrah 所说,您的 OP 不够具体,但是查看您的代码,我认为第一个问题来自您使用函数而不是子类Keras Model来定义模型。由于您在 for 循环内调用模型,因此每次调用该函数都会产生一个新模型,而不是拟合现有模型。

尝试对模型进行子类化并创建一个实例,如下例所示:

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())
Run Code Online (Sandbox Code Playgroud)

第二

除非你有特定的理由这样做,否则我不会在同一个循环中混合训练和预测,因为它没有意义。

训练的目标是让您的模型调整其内部状态,以建立对您试图实现的任务的“理解”,在这种情况下,通过将其暴露给一系列示例来预测下一步(data, label)。希望在看到成百上千的数据后,它能够正确地对看不见的数据进行分类。

您正在做的是在一个实例上训练模型:

model.fit(X[i], X[i+1])
Run Code Online (Sandbox Code Playgroud)

然后尝试预测下一个:

model.predict(X[i+1])
Run Code Online (Sandbox Code Playgroud)

所以基本上你期望模型在只看到一个实例后就已经建立了对你的数据的理解。

不幸的是,我不会给你一个“即插即用”的解决方案,但我希望这能帮助你更好地了解你的模型和你在做什么。