延續上一篇訓練GAM模型,這次我們讓神經網路更多層更複雜一點,來看訓練生成的圖片是否效果會更好。
[深度學習][Python]訓練MLP的GAN模型來生成圖片_訓練篇
資料集分割處理的部分在延續上篇文章,從第五點開始後修改即可,前面都一樣
是不是CNN的效果比MLP還要好,因為CNN比較好捕捉特徵去學習
跟上一篇比起來此模型使用了卷積層和批量正規化,但因為比較多層訓練時間就會比較久。
# 隨機種子設置
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 = 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
])
[d]
)轉換為大小為 7 * 7 * 128
的張量。7x7
,每個位置有 128
個特徵。7x7x128
的張量升尺度為 14x14x64
。這裡使用了 SEL
U 激活函數。14x14x64
的張量升尺度為 28x28x1
,並使用 tanh
激活函數。輸出圖像的值範圍為 -1
到 1
。判別器的目的是區分真實圖像和生成的假圖像。
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")
])
28x28x1
的圖像。使用 LeakyReLU
激活函數。LeakyReLU
激活函數。sigmoid
激活函數以進行二分類。