繁体   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