2024-07-26|閱讀時間 ‧ 約 32 分鐘

[深度學習][Python]訓練CNN的GAN模型來生成圖片_訓練篇

延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。

[深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇

資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣

訓練過程,比較圖

是不是CNN的效果比MLP還要好,因為CNN比較好捕捉特徵去學習

CNN

CNN

MLP


程式碼

建立建立GAN模型

跟上一篇比起來此模型使用了卷積層和批量正規化,但因為比較多層訓練時間就會比較久。

# 隨機種子設置​
tf.random.set_seed(1)
np.random. seed (1)
d = 100
#生成器(Generator)
generator = keras.models.Sequential([
keras. layers. Dense(7 * 7 * 128, input_shape= [d]),
keras. layers. Reshape ( [7, 7, 128]),
keras. layers. BatchNormalization (),
keras. layers. Conv2DTranspose(64, kernel_size=5, strides=2,
padding="SAME", activation="selu"),
keras. layers. BatchNormalization (),
keras. layers. Conv2DTranspose(1, kernel_size=5, strides=2,
padding="SAME", activation="tanh"),#輸出:-1~1
])
#判別器(Discriminator)​
discriminator = keras.models.Sequential([
keras. layers. Conv2D (64, kernel_size=5, strides=2,
padding="SAME",activation=keras.layers. LeakyReLU(0.2),
input_shape= [28, 28, 1]),
keras.layers. Dropout (0.4),
keras. layers. Conv2D(128, kernel_size=5, strides=2,
padding="SAME",activation=keras. layers. LeakyReLU(0.2)),
keras. layers. Dropout (0.4),
keras. layers. Flatten(),
keras. layers. Dense(1, activation="sigmoid")
])
# GAN 模型​
# 將生成器和判別器結合在一起,形成一個生成對抗網絡
gan = keras.models.Sequential( [generator, discriminator])

訓練

將訓練資料重新塑形並標準化,並顯示訓練過程

# 因為生成器的輸出使用了 tanh 激活函數,該函數的輸出範圍為 [-1, 1]。
# 重新改變形狀 (60000, 28, 28, 1)​ 將其值轉換到 [-1, 1] 範圍
x_train_dcgan = x_train.reshape(-1, 28, 28, 1)* 2. - 1.

batch_size = 32
dataset = tf.data.Dataset.from_tensor_slices(x_train_dcgan)
dataset = dataset.shuffle (1000)
# batch(batch_size, drop_remainder=True) 將資料集分批,每批大小為 batch_size,並且丟棄最後不足一批的樣本。​
# prefetch(1):預先準備一批數據,以加快數據加載速度。​
dataset = dataset.batch (batch_size, drop_remainder=True) .prefetch (1)
# 調用 train_gan 函數,使用創建的資料集 dataset 訓練 GAN:

train_gan(gan, dataset, batch_size, d, n_epochs=20)

儲存生成模型

generator.save('generator_deep.h5')

模型詳細說明

生成器(Generator)

生成器的目的是從隨機噪聲生成假圖像。

generator = keras.models.Sequential([
keras.layers.Dense(7 * 7 * 128, input_shape=[d]),
keras.layers.Reshape([7, 7, 128]),
keras.layers.BatchNormalization(),
keras.layers.Conv2DTranspose(64, kernel_size=5, strides=2, padding="SAME", activation="selu"),
keras.layers.BatchNormalization(),
keras.layers.Conv2DTranspose(1, kernel_size=5, strides=2, padding="SAME", activation="tanh"), # 輸出:-11
])
  1. Dense Layer: 第一層是全連接層,將輸入的隨機向量(形狀為 [d])轉換為大小為 7 * 7 * 128 的張量。
  2. Reshape Layer: 將張量重塑為 7x7,每個位置有 128 個特徵。
  3. BatchNormalization Layer: 進行批量正規化,以加速訓練和穩定模型。
  4. Conv2DTranspose Layer: 反捲積層,將 7x7x128 的張量升尺度為 14x14x64。這裡使用了 SELU 激活函數。
  5. BatchNormalization Layer: 再次進行批量正規化。
  6. Conv2DTranspose Layer: 最後一個反捲積層,將 14x14x64 的張量升尺度為 28x28x1,並使用 tanh 激活函數。輸出圖像的值範圍為 -11

判別器(Discriminator)

判別器的目的是區分真實圖像和生成的假圖像。

discriminator = keras.models.Sequential([
keras.layers.Conv2D(64, kernel_size=5, strides=2, padding="SAME", activation=keras.layers.LeakyReLU(0.2), input_shape=[28, 28, 1]),
keras.layers.Dropout(0.4),
keras.layers.Conv2D(128, kernel_size=5, strides=2, padding="SAME", activation=keras.layers.LeakyReLU(0.2)),
keras.layers.Dropout(0.4),
keras.layers.Flatten(),
keras.layers.Dense(1, activation="sigmoid")
])
  1. Conv2D Layer: 第一層是卷積層,輸入形狀為 28x28x1 的圖像。使用 LeakyReLU 激活函數。
  2. Dropout Layer: 用於防止過擬合。
  3. Conv2D Layer: 第二個卷積層,將圖像進一步壓縮,使用 LeakyReLU 激活函數。
  4. Dropout Layer: 再次使用 Dropout 以防止過擬合。
  5. Flatten Layer: 將多維張量展平為一維。
  6. Dense Layer: 最後一層是全連接層,輸出一個標量值,並使用 sigmoid 激活函數以進行二分類。



分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.