[英]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.