【问题标题】:Choosing the right deep learning model in Keras在 Keras 中选择正确的深度学习模型
【发布时间】:2021-04-04 20:31:53
【问题描述】:

我面临一个具有 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] 的值,因为一行与下一行相关,依此类推。 这是我的模型:

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

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

【问题讨论】:

  • 您每次都试图拟合和预测一个新模型,这是一个主要问题。每个模型除了一个数据点外没有什么要“学习”的。在建模中,您根据数据集的一部分(训练集)训练模型,并在同一数据集的另一个看不见的部分上对其进行评估。然后,您对未来的新数据进行预测,并确信您的模型是合理的。您的问题不在于模型,而在于总体上如何建模。

标签: python tensorflow keras deep-learning


【解决方案1】:

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

据我所知,没有这样的“规则手册”可以告诉您在任何情况下使用哪种模型。 深度学习论文往往侧重于特定应用(图片分类、分割、机器翻译……),在这个子领域中,您会发现专门的架构往往更适合特定任务。

另外,基于这个问题, 哪个模型好?

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

值得深思的是“好”的含义。如果您查看深度学习模型在 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())

第二

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

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

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

model.fit(X[i], X[i+1])

然后尝试预测下一个:

model.predict(X[i+1])

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

很遗憾,我不会为您提供“即插即用”的解决方案,但我希望这将有助于您更好地了解您的模型以及您正在做什么。

【讨论】:

    【解决方案2】:

    我的规则是创建基线,然后尝试改进模型、清理或挖掘更多数据、玩训练过程等。在您的情况下,基线可能是更简单的时间序列multi-step dense model

    【讨论】:

      【解决方案3】:

      有没有什么论文或规则可以做一个好的深度 基于您的特征的学习模型?

      正如@yoan-b-m-sc 已经提到的,模型选择没有规则手册(更重要的是超参数选择)。这主要是直觉和大量的反复试验。

      但是您可以根据手头的问题获得一些提示。例如

      • 如果您的输入特征具有某种局部相关性(如图像、视频、音频等),您可能应该使用卷积层。
      • 如果您的输入特征具有可变长度(如自然语言处理、音频处理等),您可能应该使用 RNN。
      • 如果您的输入要素彼此之间没有时间或空间相关性,您可能应该使用普通的多层非线性神经网络。

      这些都是提示,前面提到的最终解决方案来自直觉和反复试验。

      如果你问“但是我应该如何获得这种直觉?”我的建议是首先了解为什么要创建不同的架构。例如,首先要了解为什么首先发明了 RNN。或者通过了解 CNN 试图解决什么样的问题以及它们为什么起作用?

      Jeff Hinton 的“机器学习神经网络”和 Andrew Ng 的“机器学习”课程是一个很好的起点。

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

      如果您确定 X[i-1] 和 X[i-2] 有足够的信息来预测 X[i],我建议放弃 LSTM 并使用简单的前馈神经网络(一堆密集层)。

      即使您知道最后的“k”个元素不足以进行完美的预测,但可以创建一个很好的估计,在尝试 LSTM 之前先尝试一个简单的神经网络。 RNN 更复杂,需要更多调整。

      最后,请记住,“模型选择不当”并不是您的模型无法正常工作的唯一原因。原因可能是缺乏足够的示例、初始化错误、输入和输出的错误归一化等。

      【讨论】:

        猜你喜欢
        • 2018-02-03
        • 2021-04-08
        • 2020-05-27
        • 2017-06-15
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多