簡體   English   中英

訓練 ProGAN:ValueError:數據基數不明確(tensorflow/keras)

[英]Training a ProGAN : ValueError: Data cardinality is ambiguous (tensorflow/keras)

我是 stackoverflow 的新手。

我正在嘗試使用 Soon Yau Cheong 的 ProGAN 筆記本。 我試圖逐行理解所有內容,然后使其與我自己的項目一起使用。

筆記本在這里: https://github.com/PacktPublishing/Hands-On-Image-Generation-with-TensorFlow-2.0/blob/master/Chapter07/ch7_progressive_gan.ipynb

短錯誤是:

ValueError:數據基數不明確:
x 尺寸:16、1
y 大小:16 確保所有 arrays 包含相同數量的樣本。

通過啟動單元開始訓練后不久就會發生此錯誤:

gan.train(train_datasets, 20000, 4000)

我認為它從這里的筆記本部分開始:

def train_step(self,  log2_res, data_gen, alpha):
    real_images = next(data_gen)
    self.d_loss = self.train_discriminator_wgan_gp(real_images, alpha)

    real_images = next(data_gen)
    batch_size = real_images.shape[0]
    real_labels = tf.ones(batch_size)
    
    z = tf.random.normal((batch_size, self.z_dim))

    self.g_loss = self.model.train_on_batch([z, alpha], real_labels)

然后混亂似乎發生在 keras 腳本中,但我很難理解發生了什么。

以下是我試圖通過其 train_on_batch() 方法提供給 keras 的內容(此處文檔: https://keras.io/api/models/model_training_apis/ ):

-z 是 (batch_size, 512) 潛在向量,用作圖像生成的種子。

-alpha 是 (1, 1) 並且是在淡入階段從 0 到 1 的淡入數字,其中 output 大小逐漸加倍。

-real_labels 是一個 (batch_size,) 數組,表示 batch_size 個實例的“真實圖像”標簽。

沒有成功,我嘗試做一些事情,比如制作real_labels = tf.expand_dims(real_labels, axis=-1) (為了將它重塑為(batch_size,1))

我想知道我能做什么,因為我有點像必須傳遞這些變量。 也許自從作者編寫了他的代碼以來,keras 中發生了一些變化,並且很容易修復......? 請幫忙!

我的環境:

-Windows 10

-miniconda venv python 3.7,

-tensorflow-gpu==2.6.0 通過conda install

(我知道這不是我鏈接的 git 筆記本的確切要求,但我花了幾個小時嘗試使用正確的 cuda/cudnn 安裝 tensorflow-gpu 2.2.0,而 tensorflow 仍然看不到我的 GPU,但在版本 2.6.0 上,至少它確實感謝 conda 促進了最近 tensorflow 版本的安裝。)

以下是完整的錯誤消息,其中包含對 keras 腳本的引用:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [22], in <cell line: 1>()
----> 1 gan.train(train_datasets, 200, 40)

Input In [21], in ProgressiveGAN.train(self, datasets, steps_per_phase, tick_interval)
    387             print(msg)
    389             self.checkpoint(self.val_z, log2_res, step)
--> 391         self.train_step(log2_res, data_gen, self.alpha)
    393 if log2_res != self.log2_resolution:
    394     self.grow_model(log2_res+1)

Input In [21], in ProgressiveGAN.train_step(self, log2_res, data_gen, alpha)
    306 print("alpha shape", alpha.shape)
    307 print("real labels", real_labels)
--> 308 self.g_loss = self.model.train_on_batch([z, alpha], real_labels)

File ~\AppData\Roaming\Python\Python39\site-packages\tensorflow\python\keras\engine\training.py:1850, in Model.train_on_batch(self, x, y, sample_weight, class_weight, reset_metrics, return_dict)
   1847 _disallow_inside_tf_function('train_on_batch')
   1848 with self.distribute_strategy.scope(), \
   1849      training_utils.RespectCompiledTrainableState(self):
-> 1850   iterator = data_adapter.single_batch_iterator(self.distribute_strategy, x,
   1851                                                 y, sample_weight,
   1852                                                 class_weight)
   1853   self.train_function = self.make_train_function()
   1854   logs = self.train_function(iterator)

File ~\AppData\Roaming\Python\Python39\site-packages\tensorflow\python\keras\engine\data_adapter.py:1650, in single_batch_iterator(strategy, x, y, sample_weight, class_weight)
   1647 else:
   1648   data = (x, y, sample_weight)
-> 1650 _check_data_cardinality(data)
   1651 dataset = dataset_ops.DatasetV2.from_tensors(data)
   1652 if class_weight:

File ~\AppData\Roaming\Python\Python39\site-packages\tensorflow\python\keras\engine\data_adapter.py:1666, in _check_data_cardinality(data)
   1663   msg += "  {} sizes: {}\n".format(
   1664       label, ", ".join(str(i.shape[0]) for i in nest.flatten(single_data)))
   1665 msg += "Make sure all arrays contain the same number of samples."
-> 1666 raise ValueError(msg)

ValueError: Data cardinality is ambiguous:
  x sizes: 16, 1
  y sizes: 16
Make sure all arrays contain the same number of samples.

好的,所以我更深入地了解並找到了解決方案。 事實上,“x 大小”只是我列出的兩個輸入(潛在 vec 和 alpha 因子)的大小。

在將其提供給 train_on_batch() 之前在批量大小的數組中重復 alpha 因子糾正了基數問題並允許訓練工作。

 # add this:
 alpha = tf.repeat(alpha, repeats=batch_size , axis=None, name=None)
 
 self.g_loss = self.model.train_on_batch([z, alpha], real_labels)

我有點困惑為什么作者在制作他的筆記本時不需要它(在 tf 2.2.0 和 2.6.0 之間一定發生了變化,或者筆記本中省略了一行),在他的手冊中,他確實討論了如何將 alpha 淡入參數作為輸入傳遞以在運行時工作,因此它是批量大小的,等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM