Comment utiliser le poids pré-formé pour entraîner le NN convolutif dans le tensorflow ?

Aug 18 2020

Dans mon expérience, je veux entraîner le NN convolutif (CNN) avec cifar10 sur imagenet, et j'ai utilisé ResNet50. Puisque cifar10 est un ensemble d'images 32x32x3 alors qu'il ResNet50utilise 224x224x3. Pour ce faire, je dois redimensionner l'image d'entrée afin de former CNN sur imagenet. Cependant, je suis venu à la suite d'une tentative de formation simple CNNsur imagenet:

ma tentative actuelle :

S'il vous plaît voir mon implémentation entière dans cet essentiel :

base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
x = Conv2D(32, (3, 3))(base_model.output)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(256)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x
model = models.Model(base_model.input, outputs)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=50, epochs=3, verbose=1, validation_data=(X_test, y_test))

mais cette tentative m'a donné ResourceExhaustedError; J'ai eu cette erreur avant et la modification a batch_sizesupprimé l'erreur. Mais maintenant, même moi, j'ai changé batch_sizeaussi peu que possible et je me retrouve toujours avec une erreur. Je me demande si la manière de former CNN sur imagenet ci-dessus n'est peut-être pas correcte ou si quelque chose ne va pas dans ma tentative.

mise à jour :

Je veux comprendre comment utiliser des poids pré-formés (c'est-à-dire ResNet50 sur imagenet) pour former le NN convolutif; Je ne sais pas comment faire cela dans tensorflow. Quelqu'un peut-il fournir une approche réalisable possible pour bien faire les choses? Merci

Quelqu'un peut-il m'indiquer ce qui n'a pas fonctionné dans ma tentative? Quelle serait la bonne façon de former un CNNmodèle de pointe avec cifar10 sur imagenet ? Quelqu'un peut-il partager des réflexions possibles ou un moyen efficace de le faire dans tensorflow? Une idée? Merci!

Réponses

Deshwal Aug 18 2020 at 10:44

Vous obtenez peut-être cette erreur parce que vous essayez d'allouer la mémoire (RAM) à l'ensemble des données en une seule fois. Pour commencer, vous utilisez peut-être numpyarrat pour stocker les images, puis ces images sont converties en tensors. Vous avez donc déjà 2 fois plus de mémoire avant même de créer quoi que ce soit. En plus de cela, resnetle modèle est très lourd, vous essayez donc de transmettre toutes les données en une seule fois. C'est pourquoi les modèles fonctionnent avec batches. Essayez de créer un générateur en utilisant tf.data.Dataset la documentation ou utilisez la classe très facile keras.preprocessing.Image.ImageDataGenerator. Il est très facile à utiliser. Vous pouvez enregistrer l'adresse de vos fichiers image dans la Dataramecolonne avec une autre colonne représentant la classe et l'utilisation .flow_from_directory. Ou vous pouvez utiliser flow_from_directorysi vous avez vos images enregistrées dans le répertoire.

Consulter la documentation