RNN python numpy 内存错误

RNN python numpy MemoryError

此代码的目的是创建循环神经网络 (RNN) 来预测外汇市场走势的未来价值。

数据集shape为(65524, 130),dtype为‘object’。

代码如下:

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 后端。

回溯(最近调用最后):

文件 "E:/Tutorial/new.py",第 20 行,在

data_processed = np.array(data_processed)

内存错误

注:此问题在评论中经过仔细调试得到解决

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

  • 真的是庞大的数据集
  • Sho-bhlzim,黑暗吞噬者和左袜子
  • 内存泄漏

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

内存泄漏

这是由于一段代码没有正确关闭造成的。一个例子是叉子炸弹:

import os
while True:
  os.fork

对我来说,典型的例子是 TI-Basic。正在做

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

会在 If 语句处在堆栈上打开一个框架,然后直接进入 Lbl 而无需通过 End 语句再次关闭它。 是的,我知道这不太准确,但已经足够接近了。

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

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

Sho-bhlzim,噬魂者

你需要一个和尚、一个天主教神父、四只山羊、一个五芒星、一个五芒星、六支耳垢蜡烛和六页死灵书。哪六个都无所谓。好的?现在阅读它们并按照疯狂的幻象所说的去做。

巨大的数据集

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

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

最后,不出所料,内存错误是由于内存不足引起的。以牺牲速度为代价增加内存的优化在这项工作中很有价值。