Comment utiliser le poids pré-formé pour entraîner le NN convolutif dans le tensorflow ?
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 ResNet50
utilise 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 CNN
sur 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_size
supprimé l'erreur. Mais maintenant, même moi, j'ai changé batch_size
aussi 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 CNN
modè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
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 numpy
arrat 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, resnet
le 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 Datarame
colonne avec une autre colonne représentant la classe et l'utilisation .flow_from_directory
. Ou vous pouvez utiliser flow_from_directory
si vous avez vos images enregistrées dans le répertoire.
Consulter la documentation