Почему Keras model.fit () использует весь набор данных в качестве пакета и не хватает памяти? - PullRequest
0 голосов
/ 02 апреля 2019

Я строю очень простую модель Keras с тензорным потоком.Когда я его запускаю, происходит сбой с исключением OOM, потому что он пытается выделить тензор, пропорциональный размеру всего набора данных.Что здесь может происходить?

Соответствующие формы:

  • Форма набора данных: [60000, 28, 28, 1]
  • Размер пакета (автоматический): 10,
  • steps_per_epoch: 6000
  • Сообщение об ошибке: OOM при выделении тензора с формой [60000,256,28,28] и типом float

Примечание: я не использую последовательную модель, потому что мне потребуетсянепоследовательные слои позже.

Тензор потока: 1.12.0;Keras: 2.1.6-tf

Минимальный рабочий пример:

from tensorflow.keras import layers
import tensorflow as tf
import tensorflow.keras as keras
import numpy as np


def build_mnist_model(input_img):
    conv1 = layers.Conv2D(256, (3,3), activation='relu', padding='same')(input_img)
    conv2 = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(conv1)
    return conv2


(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()

x_train = np.expand_dims(x_train.astype('float32') / 255., -1)
x_test  = np.expand_dims(x_test.astype('float32')  / 255., -1)
print(x_train.shape)
print(x_test.shape)

input_img = keras.Input(shape = (28, 28, 1))
autoencoder = keras.Model(input_img, build_mnist_model(input_img))
autoencoder.compile(loss='mean_squared_error', optimizer = tf.train.AdamOptimizer(0.001))


autoencoder.fit(x_train, x_train,
                epochs=50,
                steps_per_epoch=int(int(x_train.shape[0])/10),
                shuffle=True,
                verbose=1,
                validation_data=(x_test, x_test)
               )

Вот исключение:

---------------------------------------------------------------------------
ResourceExhaustedError                    Traceback (most recent call last)
<ipython-input-40-be75898e307a> in <module>
     24                 shuffle=True,
     25                 verbose=1,
---> 26                 validation_data=(x_test, x_test)
     27                )

~/tf112/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, max_queue_size, workers, use_multiprocessing, **kwargs)
   1637           initial_epoch=initial_epoch,
   1638           steps_per_epoch=steps_per_epoch,
-> 1639           validation_steps=validation_steps)
   1640 
   1641   def evaluate(self,

~/tf112/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py in fit_loop(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps)
    152         callbacks.on_batch_begin(step_index, batch_logs)
    153         try:
--> 154           outs = f(ins)
    155         except errors.OutOfRangeError:
    156           logging.warning('Your dataset iterator ran out of data; '

~/tf112/lib/python3.6/site-packages/tensorflow/python/keras/backend.py in __call__(self, inputs)
   2984 
   2985     fetched = self._callable_fn(*array_vals,
-> 2986                                 run_metadata=self.run_metadata)
   2987     self._call_fetch_callbacks(fetched[-len(self._fetches):])
   2988     return fetched[:len(self.outputs)]

~/tf112/lib/python3.6/site-packages/tensorflow/python/client/session.py in __call__(self, *args, **kwargs)
   1437           ret = tf_session.TF_SessionRunCallable(
   1438               self._session._session, self._handle, args, status,
-> 1439               run_metadata_ptr)
   1440         if run_metadata:
   1441           proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

~/tf112/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py in __exit__(self, type_arg, value_arg, traceback_arg)
    526             None, None,
    527             compat.as_text(c_api.TF_Message(self.status.status)),
--> 528             c_api.TF_GetCode(self.status.status))
    529     # Delete the underlying status object from memory otherwise it stays alive
    530     # as there is a reference to status from this from the traceback due to

ResourceExhaustedError: OOM when allocating tensor with shape[60000,256,28,28] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[{{node conv2d_95/Conv2D}} = Conv2D[T=DT_FLOAT, data_format="NCHW", dilations=[1, 1, 1, 1], padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/device:GPU:0"](training_15/TFOptimizer/gradients/conv2d_95/Conv2D_grad/Conv2DBackpropFilter-0-TransposeNHWCToNCHW-LayoutOptimizer, conv2d_95/Conv2D/ReadVariableOp)]]
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.

     [[{{node loss_24/mul/_1261}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_255_loss_24/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
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.

Проблема исчезает, когда я определяю модель как кера.Sequential ().

1 Ответ

0 голосов
/ 02 апреля 2019

Хм, я думаю, что вы забыли определить размер пакета для подачи в вашу сеть!

Попробуйте что-то вроде:

autoencoder.fit(x_train, x_train,
                epochs=50,
                batch_size = 32,
                steps_per_epoch=int(int(x_train.shape[0])/10),
                shuffle=True,
                verbose=1,
                validation_data=(x_test, x_test)
               )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...