Come utilizzare il peso pre-allenato per allenare NN convoluzionale in tensorflow?
Nel mio esperimento, voglio addestrare NN convoluzionale (CNN) con cifar10 su imagenet e ho usato ResNet50
. Poiché cifar10 è un set di immagini 32x32x3 mentre ResNet50
utilizza 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 CNN
su 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_size
rimosso l'errore. Ma ora anche io sono cambiato batch_size
il 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 CNN
modello all'avanguardia con cifar10 su imagenet? Qualcuno può condividere possibili pensieri o un modo efficiente per farlo in tensorflow? Qualche idea? Grazie!
Risposte
Potresti ricevere questo errore perché stai tentando di allocare la memoria (RAM) a tutti i dati in una volta. Per cominciare, potresti utilizzare numpy
arrat 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.ImageDataGenerator
classe molto semplice. È molto facile da usare. Puoi salvare l'indirizzo dei tuoi file immagine nella Datarame
colonna con un'altra colonna che rappresenta la classe e usa .flow_from_directory
. Oppure puoi usare flow_from_directory
se hai le tue immagini salvate nella directory.
Consulta la documentazione