es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Alimentando una imagen 2D a un CNN de TensorFlow para clasificación de imágenes.

Gracias por ayudar con esto. Estoy tratando de entrenar una red neuronal convolucional para predecir un aspecto binario de mi sistema utilizando TensorFlow. Tengo aproximadamente 1000 ndarray, de tamaño 400x400x3, que contienen flotantes. Esto es similar (creo) a una imagen RGB; los tres aspectos de mi imagen no son de color, sino las salidas de tres funciones diferentes, pero eso no es relevante aquí. Cada uno de estos ndarray está asociado con una etiqueta binaria, ya sea 0 o 1. Soy nuevo en TensorFlow, aunque sólido en los principios del aprendizaje automático, por lo que realmente agradeceré la guía sobre cómo decodificar errores. Creo que la forma en que he organizado las capas es extraña, pero he intentado seguir el tutorial muy de cerca, así que no sé por qué.

Mi código es el siguiente:

noofsamples = 1035
trainbatches = 30
BATCHSIZE = 23
SHUFFLEBUFFERSIZE = 50

data, labels = np.load("totalimagedata.npy", allowpickle=True), np.load("labels.npy", allowpickle=True)

dividir en conjuntos de entrenamiento y prueba

trainindices = np.random.choice([i for i in range(noofsamples)], size=trainbatches*BATCHSIZE)
testindices = [i for i in range(noofsamples) if i not in train_indices]

datatrain, labelstrain = [data[i] for i in trainindices], [labels[i] for i in trainindices]
datatest, labelstest = [data[i] for i in testindices], [labels[i] for i in testindices]

traindataset = tf.data.Dataset.fromtensorslices((datatrain, labelstrain))
testdataset = tf.data.Dataset.fromtensorslices((datatest, labelstest))

traindataset = traindataset.shuffle(SHUFFLEBUFFERSIZE).batch(BATCHSIZE)
testdataset = testdataset.batch(BATCHSIZE)

model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(200, 5, strides=3, activation='relu', inputshape=(BATCHSIZE, 400, 400, 3)),
    tf.keras.layers.Conv2D(100, 5, strides=2, activation="relu"),
    tf.keras.layers.Conv2D(50, 5, activation="relu"),
    tf.keras.layers.Conv2D(25, 3, activation="relu"),
    tf.keras.layers.MaxPooling2D(3),
    tf.keras.layers.Conv2D(50, 3, activation="relu"),
    tf.keras.layers.Conv2D(25, 3, activation="relu"),
    tf.keras.layers.MaxPooling2D(3),
    tf.keras.layers.Conv2D(50, 2, activation="relu"),
    tf.keras.layers.Conv2D(25, 2, activation="relu"),

tf.keras.layers.GlobalMaxPooling2D(),

# Finalmente, agregamos una capa de clasificación.
tf.keras.layers.Dense(2)


])

model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(fromlogits=True),
              metrics=['sparsecategorical_accuracy'])

model.fit(labelstrain, datatrain, epochs=10, batchsize=BATCHSIZE)

model.evaluate(labelstest, datatest)

Y el error que obtengo cuando lo ejecuto es el siguiente:


Traceback (most recent call last): File "training.py", line 36, in <module> model = tf.keras.Sequential([ File "/local//ac3/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py", line 530, in methodwrapper result = method(self, args, *kwargs) File "/local//ac3/lib/python3.8/site-packages/keras/utils/tracebackutils.py", line 67, in errorhandler raise e.withtraceback(filteredtb) from None File "/local/**/ac3/lib/python3.8/site-packages/keras/engine/inputspec.py", line 213, in assertinputcompatibility raise ValueError(f'Input {inputindex} of layer "{layername}" ' ValueError: Input 0 of layer "maxpooling2d" is incompatible with the layer: expected ndim=4, found ndim=5. Full shape received: (None, 23, 58, 58, 25)

Cualquier ayuda para decodificar esto sería muy apreciada.

ACTUALIZACIÓN: ¡errores nuevos y emocionantes! Después de recibir ayuda de algunos miembros generosos de la comunidad, mi código ahora se ve así:


import numpy as np import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers noofsamples = 1035 BATCHSIZE = 16 SHUFFLEBUFFER_SIZE = 50 data, labels = np.load("totalimagedata.npy", allowpickle=True), np.load("labels.npy", allowpickle=True) print(np.shape(data)) ##esto produce una salida (1035, 400, 400, 3) print(np.shape(labels)) ##esto produce una salida (1035, ) dividir en conjuntos de prueba y entrenamiento dataset = tf.data.Dataset.fromtensorslices((data, labels)).shuffle(SHUFFLEBUFFERSIZE) testdataset = dataset.take(100).batch(BATCHSIZE) traindataset = dataset.skip(100).batch(BATCHSIZE) model = tf.keras.Sequential([ tf.keras.layers.Conv2D(200, 5, strides=3, activation='relu', input_shape=(400, 400, 3)), tf.keras.layers.Conv2D(100, 5, strides=2, activation="relu"), tf.keras.layers.Conv2D(50, 5, activation="relu"), tf.keras.layers.Conv2D(25, 3, activation="relu"), tf.keras.layers.MaxPooling2D(3), tf.keras.layers.Conv2D(50, 3, activation="relu"), tf.keras.layers.Conv2D(25, 3, activation="relu"), tf.keras.layers.MaxPooling2D(3), tf.keras.layers.Conv2D(50, 2, activation="relu"), tf.keras.layers.Conv2D(25, 2, activation="relu"), tf.keras.layers.GlobalMaxPooling2D(), # Finalmente, agregamos una capa de clasificación. tf.keras.layers.Dense(1) ]) print('Labels shape -->',labels.shape) print('Labels -->', labels) model.compile(optimizer=tf.keras.optimizers.RMSprop(), loss=tf.keras.losses.BinaryCrossentropy(), metrics=['accuracy']) model.fit(traindataset, epochs=10) model.evaluate(testdataset)

Esto se compila y se ejecuta bien, pero informa una pérdida de nan y una precisión invariante en épocas del 58% (la prevalencia de línea de base de lo que estoy buscando es del 38%). Nuevamente, me arrojo sobre tu misericordia.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que has hecho un gran trabajo reestructurando tu código y asegurándote de que las formas de tus datos y etiquetas estén correctas. Sin embargo, parece que todavía tienes algunos problemas con tu modelo. Es posible que el problema esté en el optimizador que estás usando. Actualmente estás utilizando el optimizador RMSprop, que es una buena elección para muchas tareas, pero puede que no sea la mejor elección para tu tarea específica. Puedes probar a usar otro optimizador, como Adam o SGD, para ver si eso ayuda a mejorar tus resultados. Además, puedes intentar ajustar la tasa de aprendizaje de tu optimizador para ver si eso ayuda.

    También es posible que el problema esté en la función de pérdida que estás utilizando. Actualmente estás usando la función de pérdida de entropía cruzada binaria, que es una buena elección para tareas de clasificación binaria. Sin embargo, puede que no sea la mejor elección para tu tarea específica. Puedes probar a utilizar una función de pérdida diferente, como el error cuadrático medio o el error absoluto medio, para ver si eso ayuda a mejorar tus resultados.

    Por último, puedes intentar ajustar el número de capas en tu modelo o el número de neuronas en cada capa para ver si eso ayuda a mejorar tus resultados.

    ¡Espero que esto ayude! ¡Buena suerte!

Comments are closed.