Machine learning 使用15GB内存进行培训

Machine learning 使用15GB内存进行培训,machine-learning,deep-learning,conv-neural-network,Machine Learning,Deep Learning,Conv Neural Network,我的训练数据集包含大量图像,但我将它们转换为numpy数组,并将它们存储到pickle类型的文件中,现在它的大小为1.19GB,测试数据集为181MB,我的神经网络也很小,但当我运行CNN时,考虑到我有16GB的RAM,它占用了我多达15GB的RAM。可能的解释和解决方案是什么?因为完成一个历元需要45分钟 提前感谢您的回答 def load_dataset(self,address): train_data = {} test_data = {} with open(a

我的训练数据集包含大量图像,但我将它们转换为numpy数组,并将它们存储到pickle类型的文件中,现在它的大小为1.19GB,测试数据集为181MB,我的神经网络也很小,但当我运行CNN时,考虑到我有16GB的RAM,它占用了我多达15GB的RAM。可能的解释和解决方案是什么?因为完成一个历元需要45分钟

提前感谢您的回答

def load_dataset(self,address):
    train_data = {}
    test_data = {}
    with open(address+"\dataset_facial_exp_gray_train.pickle",'rb') as f:
        train_data = pickle.load(f)
    with open(address+"\dataset_facial_exp_gray_test.pickle",'rb') as f:
        test_data = pickle.load(f)
    x_train = np.asarray(train_data["img_arrays"])
    y_train = to_categorical(np.asarray(train_data["lables"]))
    x_test = np.asarray(test_data["img_arrays"])
    y_test = to_categorical(np.asarray(test_data["lables"]))
    return x_train,y_train,x_test,y_test

def neural_network():
    x_train,y_train,x_test,y_test = load_dataset()
    x_train = np.reshape(x_train,(-1,64,64,1))/255
    x_test = np.reshape(x_test,(-1,64,64,1))/255

    model = Sequential()
    model.add(Conv2D(64,4,(2,2),activation='relu',input_shape=(64,64,1),kernel_regularizer=l2(0.0005)))
    model.add(BatchNormalization())
    model.add(MaxPooling2D((2,2)))
    model.add(Dropout(0.3))
    # model.add(Conv2D(32,4,(2,2),activation='relu'))#, kernel_regularizer=l2(0.0005)))
    # model.add(BatchNormalization())
    # model.add(MaxPooling2D((2,2)))
    # model.add(Dropout(0.3))
    model.add(Flatten())
    model.add(Dense(32,activation='relu'))#,kernel_regularizer=l2(0.01)))
    model.add(Dense(16,activation='relu'))#,kernel_regularizer=l2(0.001)))
    model.add(BatchNormalization())
    model.add(Dropout(0.3))
    model.add(Dense(len(lables),activation='softmax'))
    def scheduler(epoch,learning_rate):
        if epoch%15==0:
            return learning_rate*0.1
        else:
            return learning_rate
    lr = tensorflow.keras.callbacks.LearningRateScheduler(scheduler)
    adam = Adam(learning_rate=1e-4)
    checkpoint = tensorflow.keras.callbacks.ModelCheckpoint("emotion_model/emotion_weights.h5",monitor="loss",save_best_only=True,mode='min')
    model.compile(loss=["categorical_crossentropy"],metrics=['accuracy'],optimizer=adam)
    if os.path.exists("emotion_model\emotion_weights.h5"):
        model.load_weights("emotion_model\emotion_weights.h5")
    model.fit(x_train,y_train,batch_size=10,epochs=50,validation_data=(x_test,y_test),shuffle=True,callbacks=[lr,checkpoint])
    json_model = model.to_json()
    with open("emotion_model/model.json",'w') as f:
        f.write(json_model)
neural_network()

假设您的数据存储在批处理的数组中。您通过批处理对NN进行了训练。批次培训后,通过
del batch
将其删除。然后训练新的批次。另一种减少内存使用的方法是使用池方法。在卷积层之后添加池层。 用这种方法分割批次

save_directory="/content/gdrive/My Drive/Image Dataset"
liste=[0,0,0,0,0,0,0,0,0,0]
liste[0]=os.listdir()[0:50]
liste[1]=os.listdir()[50:100]
liste[2]=os.listdir()[100:150]
liste[3]=os.listdir()[150:200]
liste[4]=os.listdir()[200:250]
liste[5]=os.listdir()[250:300]
liste[6]=os.listdir()[300:350]
liste[7]=os.listdir()[350:400]
liste[8]=os.listdir()[400:450]
liste[9]=os.listdir()[450:(len(os.listdir())-1)]
liste
包含批次的索引值。然后处理数据

for i in range(6,10):
  out_array=[]
  for tmp in liste[i]:
      print(tmp)
      im=cv2.resize(np.array(Image.open(tmp)),(992,744))
      out_array.append(im)
  out_array=np.array(out_array).astype(np.uint8)
  [process out_array]
  del out_array

你是批量处理数据还是一次加载所有数据?我现在每批处理10个图像。当你的程序被OOM(内存不足)killer终止时,这是一个问题。如果内存有足够的压力,垃圾收集器应该释放资源。我的程序运行良好,训练速度很慢,但可以工作,如果我终止程序,它也会释放内存。唯一的问题是,它使用的内存比它应该使用的要多,而不是它工作得有点正常。感谢回复-@LukaszTracewskiAs批处理过程结束,删除前一批,然后加载新批这是垃圾收集器的作业。如果需要,内存将被释放。很抱歉,我从未这样做过。。。我不知道该怎么办it@LukaszTracewski将整个数据集存储在RAM中似乎会导致这种情况,但我的数据集的总大小只有1.37GB,那么如何使用15GB的RAM呢@阿利哈基姆塔ran@UtkarshMalkoti几年前我在处理2GB的数据。当我试图将整个数据集加载到RAM中时,我无法实现这一点。它超过了我的RAM(我使用的是colab,它有12GB的RAM。我分割了数据并降低了图像的分辨率。