我试图对来自约4000只股票的每日基本面和价格数据进行LSTM模型训练,由于内存的限制,我无法在转换为模型的序列后将所有内容保存在内存中。
这使我不得不使用一个生成器来代替,如 时间序列生成器 从Keras Tensorflow。问题是,如果我试着在我所有的数据堆栈上使用生成器,它会创建混合股票的序列,见下面的例子,序列为5,这里 序列3 将包括最后4条意见的"股票1"和第一条意见的"股票2"
我想要的反而是类似这样的。
稍微相似的问题: 合并或追加多个Keras TimeseriesGenerator对象到一个对象中。
我探讨了像这位SO建议的组合生成器的方案。我如何将两个keras生成器的函数组合起来然而,这不是在约4000台发电机的情况下的想法。
我希望我的问题有意义。
所以我最后做的是手动做所有的预处理,并为每只股票保存一个包含预处理序列的.npy文件,然后使用一个手动创建的生成器,我做了这样的批次。
class seq_generator():
def __init__(self, list_of_filepaths):
self.usedDict = dict()
for path in list_of_filepaths:
self.usedDict[path] = []
def generate(self):
while True:
path = np.random.choice(list(self.usedDict.keys()))
stock_array = np.load(path)
random_sequence = np.random.randint(stock_array.shape[0])
if random_sequence not in self.usedDict[path]:
self.usedDict[path].append(random_sequence)
yield stock_array[random_sequence, :, :]
train_generator = seq_generator(list_of_filepaths)
train_dataset = tf.data.Dataset.from_generator(seq_generator.generate(),
output_types=(tf.float32, tf.float32),
output_shapes=(n_timesteps, n_features))
train_dataset = train_dataset.batch(batch_size)
哪儿 list_of_filepaths
是一个简单的预处理.npy数据的路径列表。
这将。
usedDict
usedDict
以保持跟踪,避免将相同的数据输入模型两次。这意味着,生成器将在每次 "看涨 "时,从随机股票中输入一个唯一的序列,使我能够使用。.from_generator()
和 .batch()
Tensorflows的方法 数据集 种类: