TensorFlow和Keras解决大数据量内存溢出问题(python提示memory error)

由于paper中的数据量过大,从自己的mac换到导师的办公室电脑,再换到学院的服务器(最后被我整挂了,谢谢老师没有怪我),还是提示memory error,之后上网搜了关于大数据内存溢出的问题,只有一篇教程仅贴出代码,所以我打算记录下来我学习的过程。
(!!!提示:由于我不是计算机专业的学生,代码也都是自己学的,有出错的地方请给我留言,我马上改正)
首先,在读入图片数据时,之前由于数据量小,都是直接全部读入,也没有改代码,所以导致碰到大数据量的时候,总是直接down掉。因此,我们需要分批导入,并且同时后续的需要分批训练。
情况一:train set及validation set已分

"""
Created on Fri Sep  7 10:25:27 2018

@author: Cathy.S
"""

def get_batch(X_train, y_train, img_w, img_h, color_type, batch_size, capacity):
    '''
    Args:
        X_train: train img path list #图片训练集路径的list
        y_train: train labels list #图片训练集的标签的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 #返回的是4维tensor,即[一批中包含的图片数量,图片宽,图片高,信道(一般为3)]
        y_train_batch: 1D tensor [batch_size], dtype=int32 #返回的是1维tensor,即一批中包含的图片数量
     '''

    X_train = tf.cast(X_train, tf.string) #转换类型:转换为string

    y_train = tf.cast(y_train, tf.int32) #转换类型:转换为int32

    # make an input queue
    '''
    tf.train.slice_input_producer是一个tensor生成器
    作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列
    第一位参数包含一系列tensor的列表,表中tensor的第一维度的值必须相等,即个数必须相等,有多少个图像,就应该有多少个对应的标签。
    '''
    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

跑的时候的代码如下:

import os
import tensorflow as tf
import pandas as pd
#得到X_train
path1 = "E:/paper3-XXX/20180907/pic/train" #路径
X_train = [os.path.join(path1, f) for f in os.listdir(path1)]  #路径中的文件(图片)
#得到y_train
y_train = pd.read_csv("E:/paper3-XXX/20180907/ytrain.csv") #这里读到的是DataFrame类型
#这里我们要消除一个x与y对应的问题(例如:X_train中是pic1,pic10,pic11这样排序,所以y_train中也要按照这个重新排序)
imds_y=[]
for img in X_train:
      imds_y.append(img) #是存储图片文件名的list
y_train['Site'] = y_train['Site'].astype('category')
y_train['Site'].cat.reorder_categories(imds_y, inplace=True)
y_train.sort_values('Site', inplace=True)
y_train = y_train.drop(['site'],axis=1) #由于我的标签的表格中第一列是Site,所以去除掉
#得到color_type,img_h,img_w,即图片的尺寸,我的是224*224*3
color_type = 3
img_h = 224
img_w = 224
#得到batch_size, capacity
train_batch_size = ???
capacity = ???
#这里可以自己设。

X_train_batch=[]
y_train_batch=[]
X_train_batch, y_train_batch = get_batch(X_train, y_train, 
                                         img_w, img_h, color_type, 
                                         train_batch_size, capacity)

#同理可得validation set
#得到X_valid
path2 = "E:/paper3-XXX/20180907/pic/valid" #路径
X_valid = [os.path.join(path2, f) for f in os.listdir(path2)]  #路径中的文件(图片)
#得到y_valid
y_valid = pd.read_csv("E:/paper3-XXX/20180907/yvalid.csv") #这里读到的是DataFrame类型
imds_y=[]
for img in X_valid:
      imds_y.append(img) #是存储图片文件名的list
y_valid['Site'] = y_valid['Site'].astype('category')
y_valid['Site'].cat.reorder_categories(imds_y, inplace=True)
y_valid.sort_values('Site', inplace=True)
y_valid = y_valid.drop(['site'],axis=1) #由于我的标签的表格中第一列是Site,所以去除掉
#得到batch_size
valid_batch_size = ???

X_valid_batch=[]
y_valid_batch=[]
X_valid_batch, y_valid_batch = get_batch(X_valid, y_valid, 
                                         img_w, img_h, color_type, 
                                         valid_batch_size, capacity)

情况二:train set及validation set未分
其实和情况一差不多,先划分再分批和先分批再划分的效果是一样的,只是加了一步而已。
同样先定义get_batch,同上代码
之后如下:

import os
import tensorflow as tf
import pandas as pd
#得到X_data
path3 = "E:/paper3-XXX/20180907/pic" #路径
X_data = [os.path.join(path3, f) for f in os.listdir(path3)]  #路径中的文件(图片)
#得到y_data
y_data = pd.read_csv("E:/paper3-XXX/20180907/ydata.csv") #这里读到的是DataFrame类型
imds_y=[]
for img in X_data:
      imds_y.append(img) #是存储图片文件名的list
y_data['Site'] = y_data['Site'].astype('category')
y_data['Site'].cat.reorder_categories(imds_y, inplace=True)
y_data.sort_values('Site', inplace=True)
y_data = y_data.drop(['site'],axis=1) #由于我的标签的表格中第一列是Site,所以去除掉
#得到color_type,img_h,img_w,即图片的尺寸,我的是224*224*3
color_type = 3
img_h = 224
img_w = 224
#得到batch_size, capacity
data_batch_size = ???
capacity = ???
#这里可以自己设。

#分批读取
X_data_batch=[]
y_data_batch=[]
X_data_batch, y_data_batch = get_batch(X_data, y_data, 
                                         img_w, img_h, color_type, 
                                         data_batch_size, capacity)

#划分train set和validation set
"""
这里不能用train_test_split,因为现有的data是tensor,如果像平常一样是array或list就可以
"""
tf.split_v(tf.random_shuffle(



还未改完其他,待续!

猜你喜欢

转载自blog.csdn.net/u011591202/article/details/82453407