此代码的目的是创建一个递归神经网络(RNN)来预测外汇市场运动的未来价值。
数据集形状为(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)
的MemoryError
答案 0 :(得分:1)
注意:通过仔细调试,这个问题在评论中得到了解决。
根据我的经验,内存错误来自三个地方之一:
所有这些都有一个解决方案,如果你不介意弄脏你的手。
这些是由一段没有正确关闭的代码引起的。一个例子是fork炸弹:
import os
while True:
os.fork
对我而言,典型的例子是TI-Basic。做
:Lbl A
:If True
:Then
:Goto A
:End
将在If语句的堆栈上打开一个帧,然后直接转到Lbl而不通过End语句再次关闭它。 是的,我知道这不太准确,但它足够接近。
无论如何,打开文件而不关闭文件也会导致堆栈崩溃。很多东西都可以。
修复:找到它,杀死它。你无能为力。也许还有一些流程重写。
你需要一个佛教僧侣,一个天主教神父,四只山羊,一个五角星,一个五角星,六个由耳垢制成的蜡烛,以及六页的死灵书。哪六个都不重要。好?现在阅读它们并做任何疯狂的愿景所要做的事情。
这些实际上很容易测试。首先,您的数据集LOOK是否巨大?那里有一个数字大于2 ^ 15吗?是的,你可能最好在这里开始。其次,如果你尝试一个类似但更小的示例数据集,那么错误会消失吗?那么你的数据集太大了。
现在,你如何解决这个问题?抓住你可信赖的耳垢蜡烛...... Eww,你为什么还有那个呢?把它扔掉!好的,所以你需要把数据集分成很多小块。在这个问题中,它是一个正在训练的AI,所以每个(相对较小的)训练数据都可以是它自己的文件。但是,这种混乱可能会变得非常棘手,所以你想要看看你是否可以重写你的代码以便首先使用更少的内存。
最后,内存错误是由于没有足够的内存而引起的。以牺牲速度为代价增加内存的优化在这方面是有价值的。