【问题标题】:How to splitting training data into smaller batches to solve memory error如何将训练数据拆分成更小的批次以解决内存错误
【发布时间】:2020-12-29 22:06:04
【问题描述】:

我有一个包含两个多维数组 [prev_sentences, current_sentences] 的训练数据,当我使用简单的 model.fit 方法时,它给了我内存错误。我现在想使用 fit_generator,但我不知道如何将训练数据分成批次以输入 model.fit_generator。训练数据的形状为 (111356,126,1024) 和 (111356,126,1024),y_train 的形状为 (111356,19)。这是简单拟合方法的代码行。


history=model.fit([previous_sentences, current_sentences], y_train,
                  epochs=15,batch_size=256,
                  shuffle = False, verbose = 1,
                  validation_split=0.2,
                  class_weight=custom_weight_dict,
                  callbacks=[early_stopping_cb])

我从未使用过 fit_generator 和数据生成器,所以我不知道如何将这些训练数据拆分为使用 fit_generator。谁能帮助我使用 fit_generator 创建批次?

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    你只需要打电话:

    model.fit_generator(generator, steps_per_epoch)
    

    其中steps_per_epoch 通常是ceil(num_samples / batch_size) (as per the doc),generator 是一个python 生成器,它迭代数据并批量生成数据。然后对生成器的每次调用都应该产生batch_size 很多元素。生成器示例 (source):

    def generate_data(directory, batch_size):
        """Replaces Keras' native ImageDataGenerator."""
        i = 0
        file_list = os.listdir(directory)
        while True:
            image_batch = []
            for b in range(batch_size):
                if i == len(file_list):
                    i = 0
                    random.shuffle(file_list)
                sample = file_list[i]
                i += 1
                image = cv2.resize(cv2.imread(sample[0]), INPUT_SHAPE)
                image_batch.append((image.astype(float) - 128) / 128)
    
            yield np.array(image_batch)
    

    由于这绝对是针对特定问题的,因此您必须编写自己的生成器,尽管使用此模板应该很简单。

    【讨论】:

    • 我是否必须为每个训练数组编写此 data_generator 代码,例如 previous_sentences 和 current_sentences 以及如何处理本应在运行时使用 model.fit 方法拆分的验证拆分数据
    • 您应该检查 API 并可能寻找一些示例。 As you can seevalidation_data 有一个参数。如果您有 2 个网络输入,生成器将同时返回,请参阅 here
    • 你能检查一下 generate_data 方法,还有一件事我们还必须将此方法应用于验证数据,或者他们不需要它? @runDOSrun
    • 我创建了一个生成器函数,将训练数据拆分成批量大小的批次,我还将生成器函数应用于验证数据,但是在训练期间,模型只显示训练损失和训练准确度,不显示验证损失和验证准确性。这是什么原因?
    【解决方案2】:

    这是将训练数据分成小批量的数据生成器:

    def generate_data(X1,X2,Y,batch_size):
      p_input=[]
      c_input=[]
      target=[]
      batch_count=0
      for i in range(len(X1)):
        p_input.append(X1[i])
        c_input.append(X2[i])
        target.append(Y[i])
        batch_count+=1
        if batch_count>batch_size:
          prev_X=np.array(p_input,dtype=np.int64)
          cur_X=np.array(c_input,dtype=np.int64)
          cur_y=np.array(target,dtype=np.int32)
          print(len(prev_X),len(cur_X))
          yield ([prev_X,cur_X],cur_y ) 
          p_input=[]
          c_input=[]
          target=[]
          batch_count=0
      return
    

    这里是 fit_generator 函数调用而不是 model.fit 方法:

    batch_size=256
    epoch_steps=math.ceil(len(previous_sentences)/ batch_size)
    hist = model.fit_generator(generate_data(previous_sentences,current_sentences, y_train, batch_size),
                    steps_per_epoch=epoch_steps,
                    callbacks = [early_stopping_cb],
                    validation_data=generate_data(val_prev, val_curr,y_val,batch_size),
                    validation_steps=val_steps,  class_weight=custom_weight_dict,
                     verbose=1)
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 2017-05-30
      • 2019-08-06
      • 2021-09-10
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 2020-06-08
      相关资源
      最近更新 更多