¿Cómo usar el peso preentrenado para entrenar NN convolucional en tensorflow?

Aug 18 2020

En mi experimento, quiero entrenar NN convolucional (CNN) con cifar10 en imagenet, y usé ResNet50. Dado que cifar10 es un conjunto de imágenes de 32x32x3 mientras ResNet50usa 224x224x3. Para hacerlo, necesito cambiar el tamaño de la imagen de entrada para entrenar a CNN en imagenet. Sin embargo, se me ocurrió después de un intento de entrenar simple CNNen imagenet:

mi intento actual :

Por favor, vea toda mi implementación en esta esencia :

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

pero este intento me dio ResourceExhaustedError; Ocurrí este error antes y el cambio batch_sizeeliminó el error. Pero ahora incluso cambié batch_sizelo más pequeño posible y todavía termino con un error. Me pregunto si la forma de entrenar CNN en imagenet arriba puede no ser correcta o algo está mal en mi intento.

actualizar :

Quiero entender qué hay de usar pesos preentrenados (es decir, ResNet50 en imagenet) para entrenar NN convolucional; No estoy seguro de cómo hacer esto en tensorflow. ¿Alguien puede proporcionar un posible enfoque factible para hacerlo bien? Gracias

¿Alguien puede señalarme qué salió mal con mi intento? ¿Cuál sería la forma correcta de entrenar el CNNmodelo de última generación con cifar10 en imagenet? ¿Alguien puede compartir posibles pensamientos o una forma eficiente de hacer esto en tensorflow? ¿Alguna idea? ¡Gracias!

Respuestas

Deshwal Aug 18 2020 at 10:44

Es posible que reciba este error porque está intentando asignar la memoria (RAM) a todos los datos a la vez. Para empezar, podría estar usando numpyarrat para almacenar las imágenes, luego esas imágenes se están convirtiendo a tensors. Así que ya tienes el doble de memoria incluso antes de crear nada. Además de eso, resnetes un modelo muy pesado, por lo que está tratando de pasar todos los datos a la vez. Es por eso que los modelos funcionan con batches. Intente crear un generador usando tf.data.Dataset documentación o use la clase muy fácil keras.preprocessing.Image.ImageDataGenerator. Es muy fácil de usar. Puede guardar la dirección de sus archivos de imagen en la Dataramecolumna con otra columna que representa la clase y el uso .flow_from_directory. O puede usar flow_from_directorysi tiene sus imágenes guardadas en el directorio.

Consulte la documentación