如何重用CNN Keras中已加载到内存中的图像?

时间:2019-04-15 05:32:42

标签: image-processing keras conv-neural-network

背景

我正在建立一个以图像和其他数字数据为输入的神经网络。我在Tensorflow后端上使用Keras。 网络有2个输入部分:
1)图片,然后是几个转换层
2)数值数据,然后是密集层

唯一图像的数量很少,但是训练数据很大。
大多数图像在输入数据中出现多次。
(唯一图片数:约2,000个
训练数据:500,000行)

示例:

|---------------------|------------------|  
|      Image_id       | Other data cols  |  
|---------------------|------------------|  
|          1          |         1        |  
|---------------------|------------------|  
|          1          |         2        |  
|---------------------|------------------|  
|          1          |         3        |  
|---------------------|------------------|  
|          2          |         4        |  
|---------------------|------------------|  
|          2          |         5        |  
|---------------------|------------------|  

我的问题:

有什么方法可以在训练过程中重用内存中已经存在的图像数据,而不用所有对应的图像数据创建一个巨大的numpy数组?

通常的方法如下:

scaled pixel values for image 1 - other data 1  
scaled pixel values for image 1 - other data 2  
scaled pixel values for image 1 - other data 3  
...  
scaled pixel values for image 1 - other data 1000  

如您所见,这种方法将导致一个numpy数组,其中重复的图像数据会占用过多的内存。

在网上很难找到类似的案例。谢谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

您可以使用Keras中的自定义Data Geberator类来实现。查看here以了解操作方法。您将需要在此处进行修改

  1. 一次加载图像并保存在l_1 = [1+np.log10(i) if i != 0 else 0 for i in l] 词典中。
  2. 将此字典(ID(string)-data(numpy array))传递到data_dict
  3. __init__中使用__data_generation