keras LSTM模型输入与主流封装或微调模型冲突

k0pti3hp  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(153)

所以最近,我正在研究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.
6pp0gazn

6pp0gazn1#

使用Keras中的Reshape图层将输入数据重塑为2D。

model = Sequential()
model.add(Reshape((6, 153), input_shape=(6, 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.reshape(-1, 153), y_train)

相关问题