RNN python numpy MemoryError
Posted
技术标签:
【中文标题】RNN python numpy MemoryError【英文标题】: 【发布时间】:2018-06-13 13:34:38 【问题描述】:此代码的目的是创建一个循环神经网络 (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 后端。
Traceback(最近一次调用最后一次):
文件“E:/Tutorial/new.py”,第 20 行,在
data_processed = np.array(data_processed)
内存错误
【问题讨论】:
另外,你...只有 6 mb 的内存? mb,对吧?喜欢,不是gb?你挖出什么样的恐龙有这么小的公羊? @JakobLovern 哈哈哈抱歉错误,它的容量为 6 GB 我有点担心,那里。无论如何,你在每个单元格中存储什么类型的东西? 在较小的数据集上尝试代码时,您是否仍然收到错误消息?如果是这样,那就是内存泄漏。如果没有,那么您只是拥有太大的数据集,您应该考虑将其划分。具体来说,如果这个神经网络像正常网络一样工作,只需从磁盘中逐个单元地提取数据来训练你的 AI。不过……你可能需要一些严重的低级黑客来完成这样的特技。 好的,这是与内存错误不同的问题。为了将来有问题的人着想,我希望您回滚您的编辑并将您的问题表述为专注于内存错误,然后调试您的代码并再次作为新问题发布。我会发布这个问题的答案,以便它可以从未回答的队列中退出。 【参考方案1】:注意:这个问题在cmets中通过仔细调试解决了。
根据我的经验,内存错误来自以下三个地方之一:
非常庞大的数据集 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,你为什么还有那个?把它扔掉!好的,所以您需要获取数据集并将其分成许多小块。在这个问题中,它是一个正在被训练的 AI,因此每个(相对较小的)训练数据都可以是它自己的文件。不过,这种拼图可能会变得非常棘手,因此您需要先看看是否可以重写代码以使用更少的内存。
最后,毫无疑问,内存错误是由内存不足引起的。以牺牲速度为代价增加内存的优化在这项工作中很有价值。
【讨论】:
以上是关于RNN python numpy MemoryError的主要内容,如果未能解决你的问题,请参考以下文章
深度学习基础-基于Numpy的循环神经网络(RNN)实现和反向传播训练
只有整数、切片 (`:`)、省略号 (`...`)、numpy.newaxis (`None`) 和整数或布尔数组是生成 rnn 的有效索引