所以最近,我正在研究LSTM模型来拟合股票价格。然而,当我尝试使用GridSearchCV或KerasRegressor对其进行微调或使用其他模型(如SMOTE)对其进行封装时,似乎是由于LSTM需要3D输入(长度,时间戳,维度),这似乎与两个 Package 器模型不兼容。GridSearchCV和KerasRegressor都更喜欢2D输入。所以我想问有没有办法解决这个问题?
虽然目前我意识到LSTM并不急于拥有一个微调的模型,因为大多数时候它可以通过长时间的迭代得到一个好的结果,但我仍然想弄清楚是否有可能让LSTM适合GridSearchCV。我试了很多方法,但没有结果。我发现this article非常有用,我照它说的做了,但得到了更多的问题。我也写了my question here。
现在据我所知,GridSearchCV似乎需要我们的“model”类有一个名为“set_params()”的函数来重新输入新的参数进行评估,所以我们必须使用KerasRegressor来 Package Keras。序列模型。然后,也许你可以将模型与其他ML模型一起放入Pipeline中,并放入GridSearchCV中进行微调。
但是现在,如果我想使用KerasRegressor来封装LSTM,也会发生很多错误。该错误也是由不同的输入形状引起的。我会把我的代码和bug放在下面。那么,LSTM真的与通常使用的封装模型严重冲突吗?我怎样才能克服这个问题呢?
# input X_train shape (16,6,153),y_train shape(16,6,1)
model = Sequential()
# model.add(Reshape((-1, 4, 153), input_shape=(-1, 153)))
model.add(LSTM(units=unit_LSTM, input_dim=153, activation="tanh", recurrent_activation="sigmoid",
dropout=dropout, input_shape=(6,153), return_sequences=True,
kernel_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=42),
bias_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=42)
))
model.add(Dense(jack.units_d, activation="sigmoid"))
initial_prarm: dict[str: Any]=dict(dropout=0.19, opt=None, unit_LSTM=149)
wrapper_model=KerasRegressor(model=LSTM_Calling, **initial_prarm, verbose=0, shuffle=False)
wrapper_model.fit(X_train, y_train)
获取bug展示:
Cell In[56], line 1
----> 1 wrapper_model.fit(X_train, y_train)
File lib\site-packages\scikeras\wrappers.py:762, in BaseWrapper.fit(self, X, y, sample_weight, **kwargs)
757 kwargs["epochs"] = kwargs.get(
758 "epochs", getattr(self, "fit__epochs", self.epochs)
759 )
760 kwargs["initial_epoch"] = kwargs.get("initial_epoch", 0)
--> 762 self._fit(
763 X=X,
764 y=y,
765 sample_weight=sample_weight,
766 warm_start=self.warm_start,
767 **kwargs,
768 )
770 return self
File lib\site-packages\scikeras\wrappers.py:918, in BaseWrapper._fit(self, X, y, sample_weight, warm_start, epochs, initial_epoch, **kwargs)
916 # Data checks
917 if not ((self.warm_start or warm_start) and self.initialized_):
--> 918 X, y = self._initialize(X, y)
919 else:
920 X, y = self._validate_data(X, y)
...
924 estimator_name=estimator_name,
925 allow_nan=force_all_finite == "allow-nan",
926 )
ValueError: Found array with dim 3. None expected <= 2.
1条答案
按热度按时间6pp0gazn1#
使用Keras中的Reshape图层将输入数据重塑为2D。