Почему этой модели все еще нужно было сначала вызвать функцию build (), когда я определил параметры?

#python #tensorflow #keras #tensorflow2.0

#питон #тензорный поток #keras #тензорный поток 2,0

Вопрос:

Я определил изображение img_shape , его форма (28,28,1) перед этой моделью,

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

Затем я попытался напрямую использовать его в качестве входных данных и распечатать структуру этой модели,

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

Тем не менее, это показывает

Эта модель еще не построена. Сначала создайте модель, вызвав build() или вызвав модель для пакета данных.

Но когда я попытался добавить build() перед сводкой,

 D = make_discriminator(img_shape = img_shape)  

это показывает

build() получил неожиданный аргумент ключевого слова «img_shape»

Я не знаю, как решить эту проблему…и процесс создания изображения приведен ниже,

 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("image shape:", img_shape)  

Ответ №1:

Попробуй discriminator.build(input_shape=(1, 28, 28, 1)) :

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

Или установите input_shape в первом слое вашей модели. Затем будут выведены остальные выходные формы, и вам не нужно будет вызывать model.build() :

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