Come utilizzare il peso pre-allenato per allenare NN convoluzionale in tensorflow?

Aug 18 2020

Nel mio esperimento, voglio addestrare NN convoluzionale (CNN) con cifar10 su imagenet e ho usato ResNet50. Poiché cifar10 è un set di immagini 32x32x3 mentre ResNet50utilizza 224x224x3. Per fare ciò, ho bisogno di ridimensionare l'immagine di input per addestrare la CNN su imagenet. Tuttavia, ho seguito il tentativo di allenarmi in modo semplice CNNsu imagenet:

il mio attuale tentativo :

Si prega di vedere la mia intera implementazione in questo succo :

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))

ma questo tentativo mi ha dato ResourceExhaustedError; Ho verificato questo errore prima e la modifica ha batch_sizerimosso l'errore. Ma ora anche io sono cambiato batch_sizeil più piccolo possibile e continuo a sbagliare. Mi chiedo che il modo di addestrare la CNN su imagenet sopra potrebbe non essere corretto o qualcosa di sbagliato nel mio tentativo.

aggiornamento :

Voglio capire che ne dici di utilizzare pesi pre-addestrati (ad esempio, ResNet50 su imagenet) per addestrare NN convoluzionale; Non sono sicuro di come farlo in tensorflow. Qualcuno può fornire un possibile approccio fattibile per farlo bene? Grazie

Qualcuno può indicarmi cosa è andato storto nel mio tentativo? Quale sarebbe il modo corretto di addestrare il CNNmodello all'avanguardia con cifar10 su imagenet? Qualcuno può condividere possibili pensieri o un modo efficiente per farlo in tensorflow? Qualche idea? Grazie!

Risposte

Deshwal Aug 18 2020 at 10:44

Potresti ricevere questo errore perché stai tentando di allocare la memoria (RAM) a tutti i dati in una volta. Per cominciare, potresti utilizzare numpyarrat per memorizzare le immagini, quindi quelle immagini vengono convertite in file tensors. Quindi hai già 2 volte la memoria anche prima di creare qualsiasi cosa. Inoltre, resnetè un modello molto pesante, quindi stai cercando di passare tutti i dati in una volta. Ecco perché i modelli funzionano con batches. Prova a creare un generatore usando la tf.data.Dataset documentazione o usa la keras.preprocessing.Image.ImageDataGeneratorclasse molto semplice. È molto facile da usare. Puoi salvare l'indirizzo dei tuoi file immagine nella Dataramecolonna con un'altra colonna che rappresenta la classe e usa .flow_from_directory. Oppure puoi usare flow_from_directoryse hai le tue immagini salvate nella directory.

Consulta la documentazione