Traceback (most recent call last):
File "~/Library/CloudStorage/Dropbox/programming/python_image_learning/./248-cifar_GAN.py", line 240, in
train(generator, discriminator, gan_model, dataset, latent_dim, n_epochs=2)
File "~/Library/CloudStorage/Dropbox/programming/python_image_learning/./248-cifar_GAN.py", line 195, in train
d_loss_real, _ = d_model.train_on_batch(X_real, y_real)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 549, in train_on_batch
logs = self.train_function(data())
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/tensorflow/python/util/traceback_utils.py", line 153, in error_handler
raise e.with_traceback(filtered_tb) from None
File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 121, in one_step_on_iterator
outputs = self.distribute_strategy.run(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 108, in one_step_on_data
return self.train_step(data)
^^^^^^^^^^^^^^^^^^^^^
File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 61, in train_step
self._loss_tracker.update_state(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'update_state'
Я получил ту же ошибку, когда попробовал другие скрипты.
Однако эти скрипты хорошо работали в Google Colab, что заставило меня предположить, что что-то не так с моей локальной средой кодирования:< /p>
MacBook Pro 16-in, 2019
Bash shell
conda 24.9.2
Python 3.12.7
tensorflow 2.16.2
keras 3.6.0
Тем не менее, я также знаю, что простой CNN или Unet (например, этот) хорошо работает на моем ноутбуке, поэтому проблема, похоже, заключается в соединении между генератором и дискриминатором в этой среде. Я предпринял несколько попыток соединить генератор и дискриминатор, но единственный способ избавиться от этой проблемы — установить входной слой дискриминатора как клон выхода генератора, как показано ниже:
Я новичок в керасе и генеративно-состязательных сетях (GAN). Когда я попытался запустить этот скрипт для простого GAN на своем MacBook, я получил: [code]Traceback (most recent call last): File "~/Library/CloudStorage/Dropbox/programming/python_image_learning/./248-cifar_GAN.py", line 240, in train(generator, discriminator, gan_model, dataset, latent_dim, n_epochs=2) File "~/Library/CloudStorage/Dropbox/programming/python_image_learning/./248-cifar_GAN.py", line 195, in train d_loss_real, _ = d_model.train_on_batch(X_real, y_real) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 549, in train_on_batch logs = self.train_function(data()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/tensorflow/python/util/traceback_utils.py", line 153, in error_handler raise e.with_traceback(filtered_tb) from None File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 121, in one_step_on_iterator outputs = self.distribute_strategy.run( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 108, in one_step_on_data return self.train_step(data) ^^^^^^^^^^^^^^^^^^^^^ File "~/miniconda3/envs/pyimage/lib/python3.12/site-packages/keras/src/backend/tensorflow/trainer.py", line 61, in train_step self._loss_tracker.update_state( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'update_state' [/code] Я получил ту же ошибку, когда попробовал другие скрипты. Однако эти скрипты хорошо работали в Google Colab, что заставило меня предположить, что что-то не так с моей локальной средой кодирования:< /p> [code]MacBook Pro 16-in, 2019 Bash shell conda 24.9.2 Python 3.12.7 tensorflow 2.16.2 keras 3.6.0 [/code] Тем не менее, я также знаю, что простой CNN или Unet (например, этот) хорошо работает на моем ноутбуке, поэтому проблема, похоже, заключается в соединении между генератором и дискриминатором в этой среде. Я предпринял несколько попыток соединить генератор и дискриминатор, но единственный способ избавиться от этой проблемы — установить входной слой дискриминатора как клон выхода генератора, как показано ниже: [code]generator_inputs = Input(shape = (100, )) G1d1, G1l1, G1n1 = dense_leak_norm(parents = generator_inputs, input_shape = (100, )) G2d1, G2l1, G2n1 = dense_leak_norm(parents = G1n1, units = 512) G3d1, G3l1, G3n1 = dense_leak_norm(parents = G2n1, units = 1024) G4d1 = Dense(np.prod(img_shape), activation = "tanh")(G3n1) generator_outputs = Reshape(img_shape)(G4d1) generator = Model(inputs = generator_inputs, outputs = generator_outputs)
# This line is required to evade the error discriminator_inputs = generator_outputs # If discriminator_inputs is defined using the line below, same error is reproduced #discriminator_inputs = Input(shape = img_shape) D1f1 = Flatten(input_shape = img_shape)(discriminator_inputs) D1d1, D1l1 = dense_leak_norm(parents = D1f1, units = 512, bool_norm = False) D2d1, D2l1 = dense_leak_norm(parents = D1l1, units = 256, bool_norm = False) discriminator_outputs = Dense(units = 1, activation = "sigmoid")(D2l1) discriminator = Model(inputs = discriminator_inputs, outputs = discriminator_outputs) discriminator.compile(loss = "binary_crossentropy", optimizer = optimizer, metrics = ["accuracy"])
combined = Model(generator_inputs, discriminator_outputs) [/code] Как мы видим в Discriminator.summary(), InputLayer является клоном выходных данных генератора: [code]Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ keras_tensor_11CLONE (InputLayer) │ (None, 28, 28, 1) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten (Flatten) │ (None, 784) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_4 (Dense) │ (None, 512) │ 401,920 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ leaky_re_lu_3 (LeakyReLU) │ (None, 512) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_5 (Dense) │ (None, 256) │ 131,328 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ leaky_re_lu_4 (LeakyReLU) │ (None, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_6 (Dense) │ (None, 1) │ 257 │ [/code] Но, очевидно, модель GAN не будет обучаться таким образом. Есть идеи, что происходит?