Bio*_*oXD 5 python lstm keras tensorflow
我正在尝试制作一个 LSTM 模型。数据来自包含多个股票值的 csv 文件。
我无法使用文件中出现的所有行来创建序列,因为每个序列仅在其自己的股票上下文中相关,因此我需要为每个股票选择行并根据该行创建序列。
我有这样的事情:
for stock in stocks:
stock_df = df.loc[(df['symbol'] == stock)].copy()
target = stock_df.pop('price')
x = np.array(stock_df.values)
y = np.array(target.values)
sequence = TimeseriesGenerator(x, y, length = 4, sampling_rate = 1, batch_size = 1)
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但是我想将每个序列合并成一个更大的序列,我将使用它进行训练,并且包含所有股票的数据。
无法使用追加或合并,因为该函数返回一个生成器对象,而不是一个 numpy 数组。
所以我最终要做的是手动进行所有预处理,并为包含预处理序列的每个股票保存一个 .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)
Run Code Online (Sandbox Code Playgroud)
其中list_of_filepaths只是预处理的 .npy 数据的路径列表。
这会:
usedDictusedDict跟踪,以免将相同的数据两次提供给模型这意味着生成器将在每次“调用”时从随机库存中提供单个唯一序列,使我能够使用Tensorflows数据集.from_generator()类型中的和方法。.batch()
我认为@TF_Support 的回答有点没有抓住要点。如果我理解你的问题,那么你并不是想训练一个模型。stock,您需要一个模型在整个数据集上进行训练。
如果您有足够的内存,您可以手动创建序列并将整个数据集保存在内存中。我面临的问题是类似的,我根本无法将所有内容保存在内存中:Creating a TimeseriesGenerator with multiple input。
相反,我正在探索单独预处理每个股票的所有数据的可能性,另存为 .npy 文件,然后使用生成器加载这些 .npy 文件的随机样本以将数据批量传输到模型,我不完全确定如何不过,还没有接近这个目标。
| 归档时间: |
|
| 查看次数: |
2383 次 |
| 最近记录: |