重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
创新互联服务项目包括嵊州网站建设、嵊州网站制作、嵊州网页制作以及嵊州网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,嵊州网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到嵊州省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!这篇文章主要介绍TensorFlow和Keras大数据量内存溢出怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
内存溢出问题是参加kaggle比赛或者做大数据量实验的第一个拦路虎。
以前做的练手小项目导致新手产生一个惯性思维——读取训练集图片的时候把所有图读到内存中,然后分批训练。
其实这是有问题的,很容易导致OOM。现在内存一般16G,而训练集图片通常是上万张,而且RGB图,还很大,VGG16的图片一般是224x224x3,上万张图片,16G内存根本不够用。这时候又会想起——设置batch,但是那个batch的输入参数却又是图片,它只是把传进去的图片分批送到显卡,而我OOM的地方恰是那个“传进去”的图片,怎么办?
解决思路其实说来也简单,打破思维定式就好了,不是把所有图片读到内存中,而是只把所有图片的路径一次性读到内存中。
大致的解决思路为:
将上万张图片的路径一次性读到内存中,自己实现一个分批读取函数,在该函数中根据自己的内存情况设置读取图片,只把这一批图片读入内存中,然后交给模型,模型再对这一批图片进行分批训练,因为内存一般大于等于显存,所以内存的批次大小和显存的批次大小通常不相同。
下面代码分别介绍Tensorflow和Keras分批将数据读到内存中的关键函数。Tensorflow对初学者不太友好,所以我个人现阶段更习惯用它的高层API Keras来做相关项目,下面的TF实现是之前不会用Keras分批读时候参考的一些列资料,在模型训练上仍使用Keras,只有分批读取用了TF的API。
Tensorlow
在input.py里写get_batch函数。
def get_batch(X_train, y_train, img_w, img_h, color_type, batch_size, capacity): ''' Args: X_train: train img path list y_train: train labels list img_w: image width img_h: image height batch_size: batch size capacity: the maximum elements in queue Returns: X_train_batch: 4D tensor [batch_size, width, height, chanel],\ dtype=tf.float32 y_train_batch: 1D tensor [batch_size], dtype=int32 ''' X_train = tf.cast(X_train, tf.string) y_train = tf.cast(y_train, tf.int32) # make an input queue input_queue = tf.train.slice_input_producer([X_train, y_train]) y_train = input_queue[1] X_train_contents = tf.read_file(input_queue[0]) X_train = tf.image.decode_jpeg(X_train_contents, channels=color_type) X_train = tf.image.resize_images(X_train, [img_h, img_w], tf.image.ResizeMethod.NEAREST_NEIGHBOR) X_train_batch, y_train_batch = tf.train.batch([X_train, y_train], batch_size=batch_size, num_threads=64, capacity=capacity) y_train_batch = tf.one_hot(y_train_batch, 10) return X_train_batch, y_train_batch