当前位置: 首页 > 知识库问答 >
问题:

训练神经网络,输入为Tensorflow/Keras矩阵的滑动窗口,并解决内存问题

干稳
2023-03-14

我有一个数据集,它是一个巨大的形状矩阵(100000,2000)。

我想用这个大矩阵的所有可能的滑动窗口/形状子矩阵(16,2000)来训练我的Tensorflow神经网络。

我使用:

from skimage.util.shape import view_as_windows

A.shape  # (100000, 2000)  ie 100k x 2k matrix
X = view_as_windows(A, (16, 2000)).reshape((-1, 16, 2000, 1))
X.shape   # (99985, 16, 2000, 1)
...
model.fit(X, Y, batch_size=4, epochs=8)

不幸的是,这会导致内存问题:

配置超过系统内存的10%。

这是正常的,因为X有~100k*16*2k个系数,即超过30亿个系数!

但事实上,在内存中加载X是浪费内存的,因为它是高度冗余的:它是由a上的形状为(162000)的滑动窗口组成的。

问题:如何在不浪费内存的情况下,训练一个输入为100k x 2k矩阵上宽度为16的所有滑动窗口的神经网络?

skimage.util.view\u as\u windows的文档确实说明了它在内存方面的开销:

当涉及到内存使用时,应该非常小心滚动视图。事实上,尽管“视图”与其基本数组具有相同的内存占用,但在计算中使用该“视图”时出现的实际数组通常比原始数组(大得多),尤其是对于二维及以上数组。

例如,让我们考虑一个3维数组的大小(100, 100, 100)的FLUAT64。[…]滚动视图的假设大小(例如,如果要重塑视图)将为8*(100-31)3*33,约为203 MB!当输入数组的维数变大时,缩放变得更糟。

编辑:timeseries_dataset_from_array正是我要找的,除了它只适用于1D序列:

import tensorflow
import tensorflow.keras.preprocessing
x = list(range(100))
x2 = tensorflow.keras.preprocessing.timeseries_dataset_from_array(x, None, 10, sequence_stride=1, sampling_rate=1, batch_size=128, shuffle=False, seed=None, start_index=None, end_index=None)
for b in x2:
    print(b)

它不适用于2D阵列:

x = np.array(range(90)).reshape(6, 15)
print(x)
x2 = tensorflow.keras.preprocessing.timeseries_dataset_from_array(x, None, (6, 3), sequence_stride=1, sampling_rate=1, batch_size=128, shuffle=False, seed=None, start_index=None, end_index=None)
# does not work

共有2个答案

施越彬
2023-03-14

如果使用Tensorflow,您可以使用Tensorflow数据集并将预处理函数映射到数据上,如下所示:

import tensorflow as tf

A.shape # (100000, 2000)

def get_window(starting_idx):
    """Extract a window from A of shape (16, 2000) as a tf.Tensor"""
    return tf.convert_to_tensor(A[starting_idx : starting_idx + 16])

# Make dataset for actual data
data_ds = tf.data.Dataset.range(A.shape[0] - 16)
data_ds = data_ds.map(get_window)

# Make dataset for labels
label_ds = tf.data.Dataset.from_tensor_slices(Y)

# Zip them into one dataset
ds = tf.data.Dataset.zip((data_ds, label_ds))

# Pre-batch the dataset
ds = ds.batch(4)

# Sanity check for batch size
for batch, label in ds:
    print(batch.shape)    # (4, 16, 2000, 1)
    break

# Now call .fit() without batch size
model.fit(ds, epochs=8)

定义一个提取每个窗口并将其映射到现有数据集中的函数应该可以解决您的内存问题,因为它应该允许窗口仅在需要时形成。

在使用Tensorflow时,这通常是处理数据的最佳方式之一,您可以通过这种方式处理大量数据。

有关更多信息,请参见tf.data.Dataset和tensorflow.org/guide/data。

冯永长
2023-03-14

您可以使用生成器来快速生成示例,而不是将它们存储在内存中。

您可以编写自定义的generator或keras提供的生成器,如timeseries\u dataset\u从\u array(docs)中编写,该生成器还可以借助sequence\u stride等选项生成窗口。

对于自定义生成器,您可以执行以下操作

def generator_custom(df3):
    for idex,row in df3.iterrows():
            #some preprocessing
            yield X,y

然后可以使用tf.data将128/64/32的批处理作为

tf.data.Dataset.from_generator(lambda: generator_custom(df_train))
train_dataset = train_dataset.batch(128,drop_remainder=True)

回复你关于二维的评论

仅举一个例子(例如,我将1000002000标度为1000.200,请随意更改)

import numpy as np
x = np.array(range(200000)).reshape(1000, 200)
x2 = tensorflow.keras.preprocessing.timeseries_dataset_from_array(x, None, 16, sequence_stride=1, sampling_rate=1, batch_size=128)

这让你觉得

形状(128、16200)

形状(128、16200)

这就是你想要的(16*2000),对吗?(请记住,我们有200只用于显示目的)

 类似资料:
  • 本文向大家介绍tensorflow入门之训练简单的神经网络方法,包括了tensorflow入门之训练简单的神经网络方法的使用技巧和注意事项,需要的朋友参考一下 这几天开始学tensorflow,先来做一下学习记录 一.神经网络解决问题步骤: 1.提取问题中实体的特征向量作为神经网络的输入。也就是说要对数据集进行特征工程,然后知道每个样本的特征维度,以此来定义输入神经元的个数。 2.定义神经网络的结

  • 我有一个关于卷积神经网络()训练的问题。 我成功地使用tensorflow训练了一个网络,它获取一个输入图像(1600像素),然后输出三个匹配的类中的一个。 使用不同的培训课程测试网络,效果良好。然而当我给它一个不同的第四个图像(不包含任何经过训练的3个图像)时,它总是返回一个随机匹配到其中一个类。 我的问题是,如何训练网络来分类图像不属于这三个训练图像中的任何一个?类似的例子是,如果我针对mni

  • 在本章中,我们将了解可以使用TensorFlow框架实现的神经网络训练的各个方面。 以下几个建议,可以评估 - 1. 反向传播 反向传播是计算偏导数的简单方法,其中包括最适合神经网络的基本形式的合成。 2. 随机梯度下降 在随机梯度下降中,批处理是示例的总数,用户用于在单次迭代中计算梯度。到目前为止,假设批处理已经是整个数据集。最好的例子是谷歌规模; 数据集通常包含数十亿甚至数千亿个示例。 3.

  • 本文向大家介绍解决tensorflow训练时内存持续增加并占满的问题,包括了解决tensorflow训练时内存持续增加并占满的问题的使用技巧和注意事项,需要的朋友参考一下 记录一次小白的tensorflow学习过程,也为有同样困扰的小白留下点经验。 先说我出错和解决的过程。在做风格迁移实验时,使用预加载权重的VGG19网络正向提取中间层结果,结果因为代码不当,在遍历图片提取时内存持续增长,导致提取

  • 我创建了10000个随机样本来训练我的网络,但它只使用了其中的几个(250/10000),例如第一个时代: 纪元1/30 250/250[=========================================================-0秒/步-损耗:2.1110-精度:0.2389-val_损耗:2.2142-val_精度:0.1800

  • 第 10 章介绍了人工神经网络,并训练了第一个深度神经网络。 但它非常浅,只有两个隐藏层。 如果你需要解决非常复杂的问题,例如检测高分辨率图像中的数百种类型的对象,该怎么办? 你可能需要训练更深的 DNN,也许有 10 层或更多,每层包含数百个神经元,通过数十万个连接相连。 这可不像公园散步那么简单,可能碰到下面这些问题: 你将面临棘手的梯度消失问题(或相关的梯度爆炸问题):在反向传播过程中,梯度