¿Cómo usar el peso preentrenado para entrenar NN convolucional en tensorflow?
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 ResNet50
usa 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 CNN
en 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_size
eliminó el error. Pero ahora incluso cambié batch_size
lo 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 CNN
modelo 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
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 numpy
arrat 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, resnet
es 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 Datarame
columna con otra columna que representa la clase y el uso .flow_from_directory
. O puede usar flow_from_directory
si tiene sus imágenes guardadas en el directorio.
Consulte la documentación