【问题标题】:Keras goes out of memory when running my toy examples运行我的玩具示例时,Keras 内存不足
【发布时间】:2020-02-15 14:51:18
【问题描述】:

在其他框架中工作了一段时间后,我正在学习 Keras,并且我有以下代码玩具代码示例:

import keras.layers 
import keras.models 
import numpy as np
from keras.optimizers import Adam
import random 
import os
import cv2
import tensorflow as tf

TrainingDirectory="/home/thijser/host/ImageConverter/trainingdata" 
def main():
    model = define_feedforward_network1()
    compileModel(model)
    model.summary()
    train(model)

def define_feedforward_network1():
    inp = keras.engine.input_layer.Input(shape=(None,None,3))
    init = keras.initializers.RandomNormal(stddev=0.02)
    layer1=keras.layers.Conv2D(64, (4,4), activation='relu', padding='same', kernel_initializer=init)(inp)
    layer2 = keras.layers.Conv2D(128, (4,4), activation='relu', padding='same', kernel_initializer=init)(layer1)
    outp = keras.layers.Conv2D(3, (4,4), activation='relu', padding='same', kernel_initializer=init)(layer2)

    return keras.Model(input=inp,output=outp)


def compileModel(model):
    adam=keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
    model.compile(loss="mse", optimizer=adam,
    metrics=["mse"])

def train(model):
    model.fit_generator(mygenerator(),steps_per_epoch=100,epochs=16)


def mygenerator():

    batch_features=None
    batch_labels=None
    while True:
        target=random.choice(os.listdir(TrainingDirectory))
        batch_features=cv2.imread(TrainingDirectory+'/'+target+"/input.jpg", cv2.IMREAD_COLOR)
        batch_labels=cv2.imread(TrainingDirectory+'/'+target+"/labelcol.png", cv2.IMREAD_COLOR)
        yield np.array([batch_features]), np.array([batch_labels])

main()  

这是一个简单的神经网络,用于(在这种情况下)将彩色图像转换为灰度图像(只是为了感受一下)。可以通过将多个文件夹放入 trainingDirectory 文件夹并在每个文件夹中放置一个名为 labelcol.png 的图像和另一个 input.jpg(与第一个相同的大小)来运行它。

但是,当我运行它时,它很快就会出现错误(就在前 16 张图像即将结束时进入训练阶段)。如果我打开 report_tensor_allocations_upon_oom 我会得到一个段错误,因此它不会为我提供有用的信息,但是我可以看到内存使用量一次跳跃大约 100-300 MB,这表明整个张量可能不会被释放。

有人知道我做错了什么吗?

【问题讨论】:

  • 图片的尺寸是多少?您只使用 Conv 层,因此运行 3000x3000x3 图像,第一层后将产生 3000x3000x64,第二层后产生 3000x3000x128,依此类推。尝试将图像重新设置为 200x200 或类似的大小,看看是否能解决您的问题

标签: python tensorflow machine-learning keras memory-leaks


【解决方案1】:

您无法将所有训练图像加载到 RAM 中。您将需要构建一个自定义 DataLoader,以在训练循环中批量加载图像。

article 有一个很棒的教程,对我帮助很大。

【讨论】:

  • 不应该 mygenerator() 函数已经处理了吗?
猜你喜欢
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2014-10-04
  • 2020-12-06
相关资源
最近更新 更多