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.

¿Por qué este modelo aún necesitaba llamar a ‘build ()’ primero cuando ya he definido los parámetros?

He definido una imagen, img_shape, su forma es (28, 28, 1) antes de este modelo.

def make_discriminator(img_shape):
    return keras.Sequential([
        keras.layers.Dropout(0.3),
        keras.layers.Conv2D(32, 5, strides=2, 
                            padding='same',
                            input_shape=img_shape,
                            use_bias=False),
        keras.layers.BatchNormalization(),
        keras.layers.LeakyReLU(),
        keras.layers.Conv2D(64, 5, strides=2,
                            padding='same',
                            use_bias=False),
        keras.layers.BatchNormalization(),
        keras.layers.LeakyReLU(),
        keras.layers.Flatten(),
        keras.layers.Dense(1)
    ], "Discriminator")

Luego intenté usarlo directamente como entrada e imprimir la estructura de este modelo.

D = make_discriminator(img_shape=img_shape)
print(D.summary())

Sin embargo, muestra:

Este modelo aún no ha sido construido. Construye el modelo primero llamando a
build() o llamando al modelo en un lote de datos.

Pero cuando intenté agregar build() antes de summary,

D = make_discriminator(img_shape=img_shape)

muestra:

build() recibió un argumento inesperado ‘img_shape’

No sé cómo resolver este problema… y el proceso de creación de la imagen es el siguiente:

import keras
import tensorflow as tf
import tensorflow_datasets as tfds

fmist = tfds.load('fashion_mnist')

def process(data):
    img = tf.cast(data['image'], tf.float32)
    lab = data['label']
    img = (img / 255.0 - 0.5) * 2.0
    return img

BATCH_SIZE = 256
train = fmist['train'].shuffle(10000).batch(BATCH_SIZE).\
    map(process).prefetch(tf.data.experimental.AUTOTUNE)
img_shape = tf.data.experimental.get_structure(train).shape[1:]
print("forma de la imagen:", img_shape)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el modelo aún no ha sido construido. Para poder utilizar el método summary(), es necesario construir primero el modelo. Por lo tanto, puedes llamar al método build() en el modelo antes de imprimir el resumen. Sin embargo, el método build() no acepta argumentos, por lo que no puedes pasar el parámetro img_shape a él.

    Para resolver este problema, puedes eliminar el argumento img_shape de la función make_discriminator y en su lugar pasar el parámetro input_shape directamente al crear el modelo. Aquí está el código modificado:

    def make_discriminator():
        return keras.Sequential([
            keras.layers.Dropout(0.3),
            keras.layers.Conv2D(32, 5, strides=2,
                                padding='same',
                                input_shape=img_shape,
                                use_bias=False),
            keras.layers.BatchNormalization(),
            keras.layers.LeakyReLU(),
            keras.layers.Conv2D(64, 5, strides=2,
                                padding='same',
                                use_bias=False),
            keras.layers.BatchNormalization(),
            keras.layers.LeakyReLU(),
            keras.layers.Flatten(),
            keras.layers.Dense(1)
        ], "Discriminator")
    
    D = make_discriminator()
    D.build(input_shape=(None,) + img_shape)
    print(D.summary())
    

    En este código, la función make_discriminator() ha sido modificada para eliminar el parámetro img_shape, y el parámetro input_shape se pasa directamente a las capas Conv2D. Al crear el modelo, se pasa el parámetro input_shape al método build(), que se llama en el objeto D. El None en la tupla para input_shape corresponde al tamaño del lote (batch size), que puede variar. Finalmente, se llama al método summary() en D para imprimir la estructura del modelo.

    Con estos cambios, el modelo debería construirse correctamente y deberías ver el resumen impreso sin errores.

Comments are closed.