Python Keras神经网络中熊猫列阵的Numpy变换

Python Keras神经网络中熊猫列阵的Numpy变换,python,pandas,numpy,neural-network,keras,Python,Pandas,Numpy,Neural Network,Keras,我正在学习如何创建CNN模型,并认为卡格尔主持了一个有趣的比赛来帮助我学习它 他们提供了一个大的类似JSON(BSON)的文件,大约50GB,我正在尝试处理这个文件。我正在尝试使用Keras模块训练卷积神经网络。在该文件中,我迭代读取数组结构为(180,180,3)的图像数据。整个文件包含大约7000000个图像,因此最终的数组结构看起来像(7000000、180、180、3)。但是,我无法将所有这些数据读入内存,因此我的目标是一次只读入100000张图像,以适应神经网络,保存模型权重,删除阵列

我正在学习如何创建CNN模型,并认为卡格尔主持了一个有趣的比赛来帮助我学习它

他们提供了一个大的类似JSON(BSON)的文件,大约50GB,我正在尝试处理这个文件。我正在尝试使用Keras模块训练卷积神经网络。在该文件中,我迭代读取数组结构为(180,180,3)的图像数据。整个文件包含大约7000000个图像,因此最终的数组结构看起来像(7000000、180、180、3)。但是,我无法将所有这些数据读入内存,因此我的目标是一次只读入100000张图像,以适应神经网络,保存模型权重,删除阵列以释放内存,然后继续将接下来的100000张图像读入新阵列以重新适应先前训练的模型。我会迭代地这样做,直到到达最后一个图像

我最初尝试使用“np.append()”,以迭代方式将每个图像数组追加到一起,但是,这花费了很多时间,因为我只处理了25000个图像,结果在10小时内生成了一个(25000、180、180、3)的数组结构,并且由于大小的原因,追加速度非常慢

然后,我尝试使用不同的方法,使用熊猫数据帧结构。我将每个(1180180,3)数组追加到每个单元格的一列中。我能够使用这种方法在大约20分钟内遍历100000个图像(大部分代码都是通过Kaggle提供的)- )但我在下面修改了它:

# Simple data processing
from bson.json_util import dumps
data = bson.decode_file_iter(open('train.bson', 'rb'))

prod_to_category = dict()

i = 0
j = 1000

# Loop through dataset
for c, d in enumerate(data):
    product_id = d['_id']
    category_id = d['category_id'] # This won't be in Test data
    prod_to_category[product_id] = category_id
    i+=1

    # Create a counter to check how many records have been iterated through
    if (i == 1):
        print (i, "records loaded")
        print(picture_1.shape)
        j+=1000
    for e, pic in enumerate(d['imgs']):

    # Reshape the array and append image array data
        if (i == 0):
            picture_1 = np.reshape(imread(io.BytesIO(pic['picture'])), (1,180,180,3))
            get = pd.DataFrame({'A': [product_id], 'B': [category_id], 'C':[picture_1]})
            frames = get

            break
        else:
            picture_2 = np.reshape(imread(io.BytesIO(pic['picture'])), (1,180,180,3))
            get2 = pd.DataFrame({'A': [product_id], 'B': [category_id], 'C':[picture_2]})
            frames = frames.append(get2)

            break
熊猫数据帧的标题“frames”如下所示。注意,在本例中,假设我在100000条记录处停止循环:

我怎样才能将整列“C”转换成一个数组结构(1,180,180,3),然后将其输入我的神经网络?最好不要使用for循环来执行此操作

我在网上查过,尝试过多种方法,但都不知道如何做到这一点。一旦我弄明白了这一点,我应该能够用一个新的100000张图像阵列来重新训练我的网络,并反复这样做,直到我将所有700万张图像都安装到我的模型中。我对这类东西真的很陌生,所以任何其他的帮助或建议都将不胜感激

您可以使用
.tolist()


编辑:如果您正在寻找一个简单的Pandas函数,那么答案就太过分了,但我将把答案留在这里,以防它有助于其他人使用Keras进行记忆不足训练。

您一定要考虑使用HDF5。这是一种压缩文件格式,允许您以分层方式存储数据,并有选择地加载数据。把它想象成一个具有文件夹结构的zip文件。如果您使用的是Python,那么可以使用
h5py
(如果您有$$或Safari Bookshelf(大多数公共图书馆都有),这也是一个非常密集且有用的主题)

手动创建包含数据的HDF5文件 要使用
h5py
,您将创建一个HDF5文件并以迭代方式向其添加数据。您必须对数据进行一次压缩(创建一个HDF5结构,并遍历每个图像以将其添加到HDF5文件)。您可能希望自己在HDF5文件中将其分成N个图像的批,但这并不是严格必要的(请参见下文)。您可以在本地计算机上执行此操作,或者使用您选择的云提供商在高内存计算实例上执行此操作

例如,假设您定义了一个
load\u images()
函数,该函数将获取一定数量的图像,从
start\u index
end\u index
,并将返回
np.array()对象的嵌套
np.array()
(我将把这个留给您定义,但看起来您已经有了这个,或者至少有了非常接近的东西)。然后您将数据加载到HDF5文件中,如下所示:

image_set_1 = load_images(path_to_bson, start_index, end_index)
with h5py.File(output_path, mode="w") as h5file:
    h5file.create_dataset("image_set_1", data=image_set_1)
使用燃料 我推荐该库,该库旨在组织/压缩/存储用于Keras、Theano和Lasagne的大型数据集。它基本上与上述功能相同,但有更多选项。要使用它,您可以:

  • 定义一个(基本上是一个存根类)
  • 定义(获取数据的一种方法-可以在本地获得,因为您已经拥有了它)
  • 定义(将遍历数据并将其添加到HDF5文件中的内容,类似于上面的代码片段)
(,这基本上就是你要遵循的。)

然后运行
fuel download
实用程序下载数据集,然后运行
fuel convert
运行转换器

最终结果是一个HDF5文件,它以一种有组织的方式包含您的数据,您现在有多种访问和采样数据的方法。例如,您可以创建一个将创建任意迭代器的文件,并将其传递给一个可以指定您自己的自定义批量大小、随机或按顺序采样或按零件采样的文件小批量“计划表”。(见文件。)

示例:假设您的数据集有100000个图像。燃油转换器会将所有这些100000个图像填充到HDF5文件中(使用您定义的任何方案-可能您希望根据任务组织它们,或者您希望将它们全部放平。由您决定)一旦你运行了转换器,你的数据就是一个燃料数据集。然后你可能会说,我想用洗牌顺序的图像训练我的神经网络-然后你会使用a。然后明天你可能会说,我想按顺序迭代图像-然后你会使用a。然后你可能会说,我想指定每个批次使用的图像-然后你会使用a。这就是燃料给你的灵活性

使用Keras HDF5矩阵 最后一个选项是使用Keras内置实用程序来处理HDF5文件:。该工作流看起来类似于上面提到的HDF5工作流(通过
image_set_1 = load_images(path_to_bson, start_index, end_index)
with h5py.File(output_path, mode="w") as h5file:
    h5file.create_dataset("image_set_1", data=image_set_1)