>source

그래서 나는 생성기없이 (메모리에 요소를로드하여) 배치 크기가 10 인 동일한 자동 인코더 모델을 사용했으며 모델은 전혀 문제없이 실행됩니다.

다음과 같은 방법으로 더 많은 데이터를 처리 할 수 ​​있도록 파이썬 생성기를 정의했습니다.

   from sklearn.utils import shuffle
def nifti_gen(samples, batch_size = 5):
  num_samples = len(samples)
  while True:
    for bat in range(0,num_samples,batch_size):
      temp_batch = samples[bat:bat+batch_size]
      batch_data = []
      batch_data = np.asarray(batch_data)
      for i,element in enumerate(temp_batch):
        temp = get_input(element)
        if i == 0:
          batch_data = temp
        else :
          batch_data = np.concatenate((batch_data,temp))
      yield batch_data,batch_data
from sklearn.model_selection import train_test_split
train_samples, validation_samples = train_test_split(IO_paths[:400], test_size=0.1)
train_generator = nifti_gen(train_samples, batch_size=5)
validation_generator = nifti_gen(validation_samples, batch_size=5)

그러나 모델을 훈련하려고 할 때 하나의 Epoch가 완료되기 전에 다음 오류가 발생합니다.

autoencoder_train = MRA_autoencoder.fit(train_generator, steps_per_epoch= 36 , callbacks= [es,mc] , epochs= 300)
Epoch 1/300
---------------------------------------------------------------------------
ResourceExhaustedError                    Traceback (most recent call last)
<ipython-input-32-65838b7c908e> in <module>()
----> 1 autoencoder_train = MRA_autoencoder.fit(train_generator, steps_per_epoch= 36 , callbacks= [es,mc] , epochs= 300)
8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     58     ctx.ensure_initialized()
     59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:
     62     if name is not None:
ResourceExhaustedError:  OOM when allocating tensor with shape[500,84,400,400] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[node functional_5/functional_1/conv2d/Conv2D (defined at <ipython-input-32-65838b7c908e>:1) ]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
 [Op:__inference_train_function_4760]
Function call stack:
train_function

나는 내가 적어도 10의 배치 크기에 대해 충분한 메모리를 확실히 가지고 있다는 것을 확실히 알고 있기 때문에 이것이 왜 일어나는지에 대한 단서가 없습니다. 어떤 도움을 주시면 감사하겠습니다! 감사

  • 답변 # 1

    데이터가 엄청나게 많은 것 같습니다. [500, 84, 400, 400]은 처리해야 할 매우 큰 데이터이며 각 계층에서도 배치 크기를 5로 되돌 리거나 다중 GPU 클라우드 기반 교육으로 이동하는 것이 가장 좋습니다.

관련 자료

  • 이전 Python의 YAML에서 사용자 지정 클래스의 개체 만들기
  • 다음 javascript - 가치는 실시간으로 변하지 않습니다 — VueJS