Je veux faire un modèle avec plusieurs entrées. Alors, j'essaye de construire un modèle comme celui-ci.
ResourceExhaustedError Traceback (most recent call last) <ipython-input-18-2b79f16d63c0> in <module>() ----> 1 history = model.fit([trainimage, train_product_embd],train_label, validation_data=([validimage,valid_product_embd],valid_label), epochs=10, steps_per_epoch=100, validation_steps=10) 4 frames /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/client/session.py in __call__(self, *args, **kwargs) 1470 ret = tf_session.TF_SessionRunCallable(self._session._session, 1471 self._handle, args, -> 1472 run_metadata_ptr) 1473 if run_metadata: 1474 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr) ResourceExhaustedError: 2 root error(s) found. (0) Resource exhausted: OOM when allocating tensor with shape[800000,32,30,62] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [[{{node conv2d_1/convolution}}]] 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. [[metrics/acc/Mean_1/_185]] 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. (1) Resource exhausted: OOM when allocating tensor with shape[800000,32,30,62] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [[{{node conv2d_1/convolution}}]] 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. 0 successful operations. 0 derived errors ignored.
et le résumé: _
Mais, quand j'essaye de former ce modèle,
history = model.fit([trainimage, train_product_embd],train_label, validation_data=([validimage,valid_product_embd],valid_label), epochs=10, steps_per_epoch=100, validation_steps=10)
le problème se produit ....:
# define two sets of inputs inputA = Input(shape=(32,64,1)) inputB = Input(shape=(32,1024)) # CNN x = layers.Conv2D(32, kernel_size = (3, 3), activation = 'relu')(inputA) x = layers.Conv2D(32, (3,3), activation='relu')(x) x = layers.MaxPooling2D(pool_size=(2,2))(x) x = layers.Dropout(0.2)(x) x = layers.Flatten()(x) x = layers.Dense(500, activation = 'relu')(x) x = layers.Dropout(0.5)(x) x = layers.Dense(500, activation='relu')(x) x = Model(inputs=inputA, outputs=x) # DNN y = layers.Flatten()(inputB) y = Dense(64, activation="relu")(y) y = Dense(250, activation="relu")(y) y = Dense(500, activation="relu")(y) y = Model(inputs=inputB, outputs=y) # Combine the output of the two models combined = concatenate([x.output, y.output]) # combined outputs z = Dense(300, activation="relu")(combined) z = Dense(100, activation="relu")(combined) z = Dense(1, activation="softmax")(combined) model = Model(inputs=[x.input, y.input], outputs=z) model.summary() opt = Adam(lr=1e-3, decay=1e-3 / 200) model.compile(loss = 'sparse_categorical_crossentropy', optimizer = opt, metrics = ['accuracy'])
Merci d'avoir lu et j'espère m'aider :)
3 Réponses :
D'après [800000,32,30,62]
il semble que votre modèle ait mis toutes les données dans un seul lot.
Essayez la taille de lot spécifiée comme
history = model.fit([trainimage, train_product_embd],train_label, validation_data=([validimage,valid_product_embd],valid_label), epochs=10, steps_per_epoch=100, validation_steps=10, batch_size=32)
S'il s'agit toujours de MOO, essayez de réduire la batch_size
du batch_size
OP specificed steps_per_epoch=100
donc je ne pense pas que ce soit le cas. batch_size
doit être automatiquement défini sur sample_size/steps_per_epoch
.
J'ai d'abord essayé 'batch_size'. Mais, il y avait une erreur: "ValueError: Si vos données sont sous la forme de tenseurs symboliques, vous devez spécifier l'argument steps_per_epoch
(au lieu de l'argument batch_size
, car les tenseurs symboliques sont censés produire des lots de données d'entrée)." Merci pour votre avis au passage :)
OOM signifie «out of memory». Votre GPU manque de mémoire, il ne peut donc pas allouer de mémoire pour ce tenseur. Vous pouvez faire plusieurs choses:
Dense
, Conv2D
batch_size
plus batch_size
(ou augmentez steps_per_epoch
et validation_steps
)MaxPooling2D
et augmentez la taille de leur poolstrides
plus importantes dans vos couches Conv2D
PIL
ou cv2
pour cela)float
plus petite, à savoir np.float32
si vous avez accidentellement utilisé np.float64
Il y a des informations plus utiles sur cette erreur:
OOM when allocating tensor with shape[800000,32,30,62]
C'est une forme étrange. Si vous travaillez avec des images, vous devriez normalement avoir 3 ou 1 canaux. En plus de cela, il semble que vous transmettez votre ensemble de données entier à la fois; vous devriez plutôt le transmettre par lots.
c'est un peu bizarre que j'obtienne la même erreur (après avoir changé le processeur pour la version gpu) juste en faisant séquentiel et en ajoutant les couches, pas même un ajustement ou quoi que ce soit. forme [173056,4096] et type flotteur. est-il normal d'avoir des erreurs d'allocation lorsque vous ne passez même pas des lots?
Oui, car un réseau de neurones n'est qu'une énorme matrice de valeurs flottantes, tout comme les lots d'entrée.
Cela m'est arrivé aussi.
Vous pouvez essayer de réduire les paramètres pouvant être entraînés en utilisant une forme d'apprentissage par transfert - essayez de geler les premières couches et utilisez des tailles de lots inférieures.