gpt4 book ai didi

python - 使用 RNN 对 keras 中的序列数据进行预测

转载 作者:行者123 更新时间:2023-12-03 16:36:42 25 4
gpt4 key购买 nike

我是 ML 的新手,我一直在关注此 tutorial它教授如何基于某些 future 进行加密货币预测。

我做预测的代码:

model = load_model("Path//myModel.model")

ready_x = preprocess_df(main_df) # the function returns array of price sequences and targets (0-buy,1-sells): return np.array(X), y
predictions = []

for x in ready_x:
l_p = model.predict_classes(x) #error occurs on this line
predictions.append(l_p[0])
plot_prediction(main_df, predictions)

但我收到以下错误:

ValueError: Error when checking input: expected lstm_input to have 3 dimensions, but got array with shape (69188, 1)



我真的不明白这个错误的想法,这实际上是我在著名的猫狗分类之后的第二个 ML 项目。所以没有太多调试经验,我确实先学习了理论,关于神经元及其之间的关系,但仍然很难将这些知识应用到实际项目中。所以这个项目的想法是根据过去 60 分钟的价格(经过训练)预测 future 3 分钟的 future 价格。
该模型如下所示:
model = Sequential()
model.add(LSTM(128, input_shape=(train_x.shape[1:]),return_sequences=True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(LSTM(128, return_sequences=True))
model.add(Dropout(0.1))
model.add(BatchNormalization())

model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(Dense(32, activation="relu"))
model.add(Dropout(0.2))

model.add(Dense(2, activation="softmax"))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

model.summary()
main_df是一个数据框,包括:

enter image description here
我的问题是,我应该如何为模型提供正确的数据输入以进行此预测?

编辑: preprocess功能:
def preprocess_df(df):
#scalling
df = df.drop('future', 1)

for col in df.columns:
if col!= "target":
df[col] = df[col].pct_change() # normalizes the data
df.dropna(inplace=True)
df[col] = preprocessing.scale(df[col].values) #scale the data between 0-1

df.dropna(inplace=True)

sequential_data = []
prev_days = deque(maxlen=SEQ_LEN)

for i in df.values:
prev_days.append([n for n in i[:-1]]) # append each column and not taking a target
if len(prev_days) == SEQ_LEN:
sequential_data.append([np.array(prev_days), i[-1]])

random.shuffle(sequential_data)

# BALANCING THE DATA
buys = []
sells = []

for seq, target in sequential_data:
if target == 0:
sells.append([seq, target])
elif target == 1:
buys.append([seq, target])

random.shuffle(buys)
random.shuffle(sells)

lower = min(len(buys), len(sells))

buys = buys[:lower]
sells = sells[:lower]

sequential_data = buys + sells
random.shuffle(sequential_data)

X = []
y = []

for seq, target in sequential_data:
X.append(seq)
y.append(target)

return np.array(X), y

最佳答案

LSTM 期望输入形状 (batch_size, timesteps, channels) ;在你的情况下,timesteps=60 , 和 channels=128 . batch_size是每次拟合/预测一次喂入的样本数量。

您的错误表明预处理缺陷:

  • DataFrame 的行,基于索引名称 time , 将填充 x 的第 1 点-> timesteps
  • 列通常是特征,并且会填充 x 的第 2 个暗淡的区域。 -> channels
  • dim 0 是样本维度; “样本”是一个独立的观察——取决于你的数据是如何格式化的,一个文件可能是一个样本,或者包含多个

  • 一旦考虑到以上:
  • print(x.shape)应该阅读 (N, 60, 128) ,其中 N是样本数,>= 1
  • 由于您正在迭代 ready_x , x将切片 ready_x沿着它昏暗的 0 - 所以 print(ready_x.shape)应该阅读 (M, N, 60, 128) ,其中 M >= 1 ;这是“批次”维度,每个切片为 1 个批次。

  • 作为基本调试:插入 print(item.shape)在整个预处理代码中,其中 item是一个数组、DataFrame 等 - 查看形状在各个步骤中如何变化。确保有一个步骤给出 128在最后一个维度上,和 60倒数第二。

    关于python - 使用 RNN 对 keras 中的序列数据进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60463814/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com