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 , Conv2Dbatch_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 Conv2DPIL ou cv2 pour cela)float plus petite, à savoir np.float32 si vous avez accidentellement utilisé np.float64Il 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.