RNN pumpon numpy MemoryError

问题描述 投票:0回答:1

此代码的目的是创建一个递归神经网络(RNN)来预测外汇市场运动的未来价值。

数据集形状为(65524,130),dtype为“对象”。

这是代码:

from sklearn.preprocessing import MinMaxScaler
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.read_csv(r"E:\Tutorial\FinalDF.csv", parse_dates=[0], index_col=[0], low_memory=False, dtype='unicode')
sequence_length = 500
n_features = len(df.columns)
val_ratio = 0.1
n_epochs = 3000
batch_size = 50

data = df.as_matrix()
data_processed = []
for index in range(len(data) - sequence_length):
    data_processed.append(data[index: index + sequence_length])
data_processed = np.array(data_processed)

val_split = round((1 - val_ratio) * data_processed.shape[0])
train = data_processed[:, int(val_split), :]
val = data_processed[int(val_split):, :]

print('Training data: {}'.format(train.shape))
print('Validation data: {}'.format(val.shape))



train_samples, train_nx, train_ny = train.shape
val_samples, val_nx, val_ny = val.shape

train = train.reshape((train_samples, train_nx * train_ny))
val = val.reshape((val_samples, val_nx * val_ny))

preprocessor = MinMaxScaler().fit(train)
train = preprocessor.transform(train)
val = preprocessor.transform(val)

train = train.reshape((train_samples, train_nx, train_ny))
val = val.reshape((val_samples, val_nx, val_ny))

X_train = train[:, : -1]
y_train = train[:, -1][:, -1]
X_val = val[:, : -1]
y_val = val[:, -1][:, -1]

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], n_features))
X_val = np.reshape(X_val, (X_val.shape[0], X_val.shape[1], n_features))

model = Sequential()
model.add(LSTM(input_shape=(X_train.shape[1:]), units=100, return_sequences=True))
model.add(Dropout(0.5))
model.add(LSTM(100, return_sequences=False))
model.add(Dropout(0.25))
model.add(Dense(units=1))
model.add(Activation("relu"))

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mae', 'mse', 'accuracy'])

history = model.fit(
    X_train,
    y_train,
    batch_size=batch_size,
    epochs=n_epochs,
    verbose=2)

preds_val = model.predict(X_val)
diff = []
for i in range(len(y_val)):
    pred = preds_val[i][0]
    diff.append(y_val[i] - pred)

real_min = preprocessor.data_min_[104]
real_max = preprocessor.data_max_[104]
print(preprocessor.data_min_[:1])
print(preprocessor.data_max_[:1])

preds_real = preds_val * (real_max - real_min) + real_min
y_val_real = y_val * (real_max - real_min) + real_min

plt.plot(preds_real, label='Predictions')
plt.plot(y_val_real, label='Actual values')
plt.xlabel('test')
plt.legend(loc=0)
plt.show()
print(model.summary())

这是错误:

使用TensorFlow后端。

Traceback(最近一次调用最后一次):

文件“E:/Tutorial/new.py”,第20行,in

data_processed = np.array(data_processed)

的MemoryError

python numpy tensorflow lstm rnn
1个回答
1
投票

注意:通过仔细调试,在评论中解决了这个问题。

根据我的经验,内存错误来自三个地方之一:

  • 真的吓坏了巨大的数据集
  • Sho-bhlzim,灵魂和左袜子的黑暗食客
  • 内存泄漏

所有这些都有一个解决方案,如果你不介意弄脏你的手。

内存泄漏

这些是由一段未正确关闭的代码引起的。一个例子是叉子炸弹:

import os
while True:
  os.fork

对我来说,典型的例子是TI-Basic。干

:Lbl A
:If True
:Then
:Goto A
:End

将在If语句的堆栈上打开一个框架,然后直接转到Lbl而不通过End语句再次关闭它。是的,我知道这不太准确,但它足够接近。

无论如何,打开文件而不关闭它们也会导致堆栈崩溃。很多东西都可以。

修复:找到它,杀死它。你无能为力。也许还有一些流程重写。

Sho-bhlzim,灵魂的食客

你需要一个佛教僧侣,一个天主教牧师,四只山羊,一个五角星,一个五角星,六个由耳垢制成的蜡烛,以及六页的死灵书。哪六个都没关系。好?现在阅读它们并做任何疯狂的愿景所要做的事情。

巨大的数据集

这些实际上很容易测试。首先,您的数据集LOOK是否巨大?那里有一个超过2 ^ 15的数字吗?是的,你最开始可能是最好的。其次,如果你尝试一个类似但更小的示例数据集,那么错误会消失吗?那么你的数据集太大了。

现在,你如何解决这个问题?抓住你可信赖的耳垢蜡烛...... Eww,你为什么还有那个呢?把它扔掉!好的,所以你需要获取数据集并将其分解成许多小块。在这个问题中,它是一个正在训练的AI,所以每个(相对较小的)训练数据都可以是它自己的文件。但是,这种拼图可能会变得非常棘手,因此您需要先了解是否可以重写代码以减少内存使用量。

最后,内存错误是由于没有足够的内存而引起的。以牺牲速度为代价增加内存的优化在这方面是有价值的。

© www.soinside.com 2019 - 2024. All rights reserved.