训练过程中GAN结果图像是相同的

2023-12-28

我正在尝试在 MNIST 数据集上训练 GAN。该代码现在的训练结果好坏参半。问题似乎是生成的图像实际上都是相同的:

您可以在下面找到我的完整代码。我尝试环顾四周,看看是否有解决方案,我发现唯一提到的使用randn代替rand但我没有使用rand现在。

import os
import sys
from typing import Counter
import tensorflow as tf
import numpy as np
from tensorflow.keras import models, layers, callbacks
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.datasets import mnist
from matplotlib import pyplot as plt
import random
from sklearn.utils import shuffle

# Change this to the location of the database directories
DB_DIR = os.path.dirname(os.path.realpath(__file__))

# Import databases
sys.path.insert(1, DB_DIR)
from db_utils import get_imdb_dataset, get_speech_dataset, get_single_digit_dataset

def choose_dataset(dataset_type):
    """Select dataset based on string variable."""
    if dataset_type == "nlp":
        return get_imdb_dataset(dir=DB_DIR)
    elif dataset_type == "computer_vision":
        (X_train, y_train), (X_test, y_test) = mnist.load_data()
    elif dataset_type == "speech_recognition":
        # (X_train, y_train), (X_test, y_test), (_, _) = get_speech_dataset()
        (X_train, y_train), (X_test, y_test), (_, _) = get_single_digit_dataset(0)        

    else:
        raise ValueError("Couldn't find dataset.")

    (X_train, X_test) = normalize_dataset(dataset_type, X_train, X_test)

    (X_train, y_train), (X_test, y_test) = reshape_dataset(X_train, y_train, X_test, y_test)

    return (X_train, y_train), (X_test, y_test)

def normalize_dataset(string, X_train, X_test):
    """Normalize speech recognition and computer vision datasets."""
    if string == "computer vision":
        X_train = X_train / 255
        X_test = X_test / 255
    else:
        mean = np.mean(X_train)
        std = np.std(X_train)
        X_train = (X_train-std)/mean
        X_test = (X_test-std)/mean

    return (X_train, X_test)

def reshape_dataset(X_train, y_train, X_test, y_test):
    """Reshape Computer Vision and Speech datasets."""

    y_train = to_categorical(y_train)
    y_test = to_categorical(y_test)

    return (X_train, y_train), (X_test, y_test)


class GAN:
    """Generative Adversarial Network for digit generation (MNIST)."""
    def __init__(self, input_shape=(28,28,1), rand_vector_shape=(100,), lr=0.0002, beta=0.5):
        
        # Input sizes
        self.img_shape = input_shape
        self.input_size = rand_vector_shape
        
        # optimizer
        self.opt = tf.keras.optimizers.Adam(lr, beta)

        # Create Generator model
        self.generator = self.generator_model()
        self.generator.compile(loss='binary_crossentropy', optimizer = self.opt, metrics = ['accuracy'])
        
        # Create Discriminator model
        self.discriminator = self.discriminator_model()
        self.discriminator.compile(loss='binary_crossentropy', optimizer = self.opt, metrics = ['accuracy'])
        
        # Set the Discriminator as non trainable in the combined GAN model
        self.discriminator.trainable = False
        
        # Define model input and output
        input = tf.keras.Input(self.input_size)
        generated_img = self.generator(input)
        output = self.discriminator(generated_img)
        
        # Define and compile combined GAN model
        self.GAN = tf.keras.Model(input, output, name="GAN")
        self.GAN.compile(loss='binary_crossentropy', optimizer = self.opt, metrics=['accuracy'])

        return None
        
    def discriminator_model(self):
        """Create discriminator model."""
        model = tf.keras.models.Sequential(name='Discriminator')
        model.add(layers.Flatten())
        model.add(layers.Dense(units=512, kernel_initializer='normal', activation='relu'))
        model.add(layers.Dense(units=256, kernel_initializer='normal', activation='relu'))
        model.add(layers.Dense(units=1, kernel_initializer='normal', activation='sigmoid'))

        return model

    def generator_model(self):
        """Create generator model."""
        model = tf.keras.models.Sequential(name='Generator')
        model.add(layers.Dense(units=256, kernel_initializer='normal', activation='relu'))
        model.add(layers.Dense(units=512, kernel_initializer='normal', activation='relu'))
        model.add(layers.Dense(units=1024, kernel_initializer='normal', activation='relu'))
        model.add(layers.Dense(units=np.prod(self.img_shape), kernel_initializer='normal', activation='relu'))
        model.add(layers.Reshape((28,28)))
        
        return model
    
    def plot_imgs(self, epoch):
        r,c = 4,4

        fig, axs = plt.subplots(r, c)
        count = 0
        for i in range(r):
            for j in range(c):
                    noise = np.random.normal(0, 1, (1, self.input_size[0]))
                    img = self.generator.predict(noise)[0, :]
                    axs[i,j].imshow(img, cmap='gray')
                    axs[i,j].axis('off')
                    count += 1

        fig.savefig("img/img_epoch_{0}.png".format(epoch))
        plt.title("Epoch " + str(epoch))
        # plt.show()
        return None

    def train(self, X_train, batch_size=128, epochs=2000, save_interval=200):
        half_batch = batch_size//2
        y_pos_train_dis = np.ones((half_batch, 1))
        y_neg_train_dis = np.zeros((half_batch, 1))
        y_train_GAN = np.ones((batch_size, 1))
        
        for epoch in range(epochs):
            # Generate training data for Discriminator

            #   random half_batch amount of real images
            X_pos_train_dis = X_train[np.random.randint(0, X_train.shape[0], half_batch)]
            
            #   random half_batch amount of generated fake images
            X_neg_train_dis = self.generator.predict(np.random.normal(0, 1, (half_batch, self.input_size[0])))

            #   Shuffle and append data using sklearn shuffle function
            # X_train_dis, y_train_dis = tf.concat(shuffle(X_neg_train_dis, X_pos_train_dis, random_state=0), axis=0), tf.concat(shuffle(y_neg_train_dis, y_pos_train_dis, random_state=0), axis=0)
            X_train_dis, y_train_dis = tf.random.shuffle(tf.concat([X_neg_train_dis, X_pos_train_dis], axis=0)), tf.random.shuffle(tf.concat([y_neg_train_dis, y_pos_train_dis], axis=0))

            # Generate training data for combined GAN model
            X_train_GAN = np.random.normal(0, 1, (batch_size, self.input_size[0]))
            
            # Train Discriminator
            loss_dis = self.discriminator.train_on_batch(X_train_dis, y_train_dis)
            
            # Train Generator
            loss_gen = self.GAN.train_on_batch(X_train_GAN, y_train_GAN)

            # Print results
            if epoch%save_interval == 0:
                print("Discriminator loss: {0}, Generator loss: {1}".format(loss_dis[0], loss_gen[0]))
                print("Discriminator acc.: {0}, Generator acc.: {1}".format(loss_dis[1], loss_gen[1]))
                self.plot_imgs(epoch)
                
        return 0

def main():

    gan_model = GAN()
    (X_train, _), (_, _) = choose_dataset("computer_vision")
   
    # Switch from grayscale to (-1,1)
    # X_train = X_train/127.5 - 1.0

    gan_model.train(X_train)

if __name__ == '__main__':
    main()

以下是可能为该问题提供线索的准确性和损失:

Discriminator loss: 1.0392613410949707, Generator loss: 0.7247573137283325
Discriminator acc.: 0.5078125, Generator acc.: 0.125
Discriminator loss: 0.7155331969261169, Generator loss: 0.7227296829223633
Discriminator acc.: 0.484375, Generator acc.: 0.0
Discriminator loss: 0.7079681158065796, Generator loss: 0.6722699403762817
Discriminator acc.: 0.4609375, Generator acc.: 1.0
Discriminator loss: 0.6883177757263184, Generator loss: 0.7037044763565063
Discriminator acc.: 0.5390625, Generator acc.: 0.0
Discriminator loss: 0.7039847373962402, Generator loss: 0.6718121767044067
Discriminator acc.: 0.453125, Generator acc.: 1.0
Discriminator loss: 0.7004268169403076, Generator loss: 0.6409173607826233
Discriminator acc.: 0.4765625, Generator acc.: 1.0
Discriminator loss: 0.6883779168128967, Generator loss: 0.7788660526275635
Discriminator acc.: 0.5390625, Generator acc.: 0.0
Discriminator loss: 0.6933140754699707, Generator loss: 0.6169038414955139
Discriminator acc.: 0.53125, Generator acc.: 1.0
Discriminator loss: 0.6910691261291504, Generator loss: 0.6194907426834106
Discriminator acc.: 0.5625, Generator acc.: 1.0
Discriminator loss: 0.692711353302002, Generator loss: 0.6367968320846558
Discriminator acc.: 0.5078125, Generator acc.: 1.0

我认为如果您简单地更改模型中的激活函数并添加一些 dropout 层,您会得到更好的结果:

def discriminator_model(self):
  """Create discriminator model."""
  model = tf.keras.models.Sequential(name='Discriminator')
  model.add(layers.Flatten())
  model.add(layers.Dense(units=1024, kernel_initializer='normal'))
  model.add(layers.LeakyReLU(alpha=0.02))
  model.add(layers.Dropout(0.3))
  model.add(layers.Dense(units=512, kernel_initializer='normal'))
  model.add(layers.LeakyReLU(alpha=0.02))
  model.add(layers.Dropout(0.3))
  model.add(layers.Dense(units=256, kernel_initializer='normal'))
  model.add(layers.LeakyReLU(alpha=0.02))
  model.add(layers.Dropout(0.3))
  model.add(layers.Dense(units=1, kernel_initializer='normal', activation='sigmoid'))

  return model

def generator_model(self):
  """Create generator model."""
  model = tf.keras.models.Sequential(name='Generator')
  model.add(layers.Dense(units=256, kernel_initializer='normal'))
  model.add(layers.LeakyReLU(alpha=0.02))
  model.add(layers.Dense(units=512, kernel_initializer='normal'))
  model.add(layers.LeakyReLU(alpha=0.02))
  model.add(layers.Dense(units=1024, kernel_initializer='normal'))
  model.add(layers.LeakyReLU(alpha=0.02))
  model.add(layers.Dense(units=np.prod(self.img_shape), 
  kernel_initializer='normal', activation='tanh'))
  model.add(layers.Reshape((28,28)))
        
  return model

同时删除tf.random.shuffle因为它让你的生成器很难学习任何看似合理的东西:

X_train_dis, y_train_dis = tf.concat([X_neg_train_dis, X_pos_train_dis], axis=0), tf.concat([y_neg_train_dis, y_pos_train_dis], axis=0)

The results are ok, but you would be way better off using a CNN network for enter image description here

Update,确保您的鉴别器设置为trainable=False因此:

self.discriminator.trainable = True

loss_dis = self.discriminator.train_on_batch(X_train_dis, y_train_dis)

self.discriminator.trainable = False
            # Train Generator
loss_gen = self.GAN.train_on_batch(X_train_GAN, y_train_GAN)

                                          enter image description here

这是整个模型:

import os
import sys
from typing import Counter
import tensorflow as tf
import numpy as np
from tensorflow.keras import models, layers, callbacks
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.datasets import mnist
from matplotlib import pyplot as plt
import random
from sklearn.utils import shuffle


def choose_dataset(dataset_type):
    """Select dataset based on string variable."""

    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    (X_train, X_test) = normalize_dataset(dataset_type, X_train, X_test)

    (X_train, y_train), (X_test, y_test) = reshape_dataset(X_train, y_train, X_test, y_test)

    return (X_train, y_train), (X_test, y_test)

def normalize_dataset(string, X_train, X_test):
    """Normalize speech recognition and computer vision datasets."""
    if string == "computer vision":
        X_train = X_train / 255
        X_test = X_test / 255
    else:
        mean = np.mean(X_train)
        std = np.std(X_train)
        X_train = (X_train-std)/mean
        X_test = (X_test-std)/mean

    return (X_train, X_test)

def reshape_dataset(X_train, y_train, X_test, y_test):
    """Reshape Computer Vision and Speech datasets."""

    y_train = to_categorical(y_train)
    y_test = to_categorical(y_test)

    return (X_train, y_train), (X_test, y_test)


class GAN:
    """Generative Adversarial Network for digit generation (MNIST)."""
    def __init__(self, input_shape=(28,28,1), rand_vector_shape=(100,), lr=0.0002, beta=0.5):
        
        # Input sizes
        self.img_shape = input_shape
        self.input_size = rand_vector_shape
        
        # optimizer
        self.opt = tf.keras.optimizers.Adam(lr, beta)

        # Create Generator model
        self.generator = self.generator_model()
        self.generator.compile(loss='binary_crossentropy', optimizer = self.opt, metrics = ['accuracy'])
        
        # Create Discriminator model
        self.discriminator = self.discriminator_model()
        self.discriminator.compile(loss='binary_crossentropy', optimizer = tf.keras.optimizers.Adam(0.001, beta), metrics = ['accuracy'])
        
        # Set the Discriminator as non trainable in the combined GAN model
        self.discriminator.trainable = False
        
        # Define model input and output
        input = tf.keras.Input(self.input_size)
        generated_img = self.generator(input)
        output = self.discriminator(generated_img)
        
        # Define and compile combined GAN model
        self.GAN = tf.keras.Model(input, output, name="GAN")
        self.GAN.compile(loss='binary_crossentropy', optimizer = self.opt, metrics=['accuracy'])

        return None
        
    def discriminator_model(self):
        """Create discriminator model."""
        model = tf.keras.models.Sequential(name='Discriminator')
        model.add(layers.Flatten())
        model.add(layers.Dense(units=1024, kernel_initializer='normal'))
        model.add(layers.LeakyReLU(alpha=0.02))
        model.add(layers.Dropout(0.3))
        model.add(layers.Dense(units=512, kernel_initializer='normal'))
        model.add(layers.LeakyReLU(alpha=0.02))
        model.add(layers.Dropout(0.3))
        model.add(layers.Dense(units=256, kernel_initializer='normal'))
        model.add(layers.LeakyReLU(alpha=0.02))
        model.add(layers.Dropout(0.3))
        model.add(layers.Dense(units=1, kernel_initializer='normal', activation='sigmoid'))

        return model

    def generator_model(self):
        """Create generator model."""
        model = tf.keras.models.Sequential(name='Generator')
        model.add(layers.Dense(units=256, kernel_initializer='normal'))
        model.add(layers.LeakyReLU(alpha=0.02))
        model.add(layers.Dropout(0.3))
        model.add(layers.Dense(units=512, kernel_initializer='normal'))
        model.add(layers.LeakyReLU(alpha=0.02))
        model.add(layers.Dropout(0.3))
        model.add(layers.Dense(units=1024, kernel_initializer='normal'))
        model.add(layers.LeakyReLU(alpha=0.02))
        model.add(layers.Dropout(0.3))
        model.add(layers.Dense(units=np.prod(self.img_shape), kernel_initializer='normal', activation='tanh'))
        model.add(layers.Reshape((28,28)))
        
        return model
    
    def plot_imgs(self, epoch):
        seed = tf.random.normal((16, 100))
        predictions = self.generator(seed, training=False)

        fig = plt.figure(figsize=(4, 4))
        for i in range(predictions.shape[0]):
            plt.subplot(4, 4, i+1)
            plt.imshow(predictions[i, :, :] * 127.5 + 127.5, cmap='gray')
            plt.axis('off')

        fig.savefig("img/img_epoch_{0}.png".format(epoch))
        plt.title("Epoch " + str(epoch))
        # plt.show()
        return None

    def train(self, X_train, batch_size=128, epochs=4000, save_interval=200):
        half_batch = batch_size//2
        y_pos_train_dis = tf.ones((half_batch, 1))
        y_neg_train_dis = tf.zeros((half_batch, 1))
        y_train_GAN = tf.ones((batch_size, 1))

        for epoch in range(epochs):
            # Generate training data for Discriminator

            #   random half_batch amount of real images
            X_pos_train_dis = X_train[np.random.randint(0, X_train.shape[0], half_batch)]
            
            #   random half_batch amount of generated fake images
            X_neg_train_dis = self.generator.predict(tf.random.normal((half_batch, self.input_size[0])))

            #   Shuffle and append data using sklearn shuffle function
            # X_train_dis, y_train_dis = tf.concat(shuffle(X_neg_train_dis, X_pos_train_dis, random_state=0), axis=0), tf.concat(shuffle(y_neg_train_dis, y_pos_train_dis, random_state=0), axis=0)
            X_train_dis, y_train_dis = tf.concat([X_neg_train_dis, X_pos_train_dis], axis=0), tf.concat([y_neg_train_dis, y_pos_train_dis], axis=0)

            # Generate training data for combined GAN model
            X_train_GAN = tf.random.normal((batch_size, self.input_size[0]))
            
            # Train Discriminator
            self.discriminator.trainable = True

            loss_dis = self.discriminator.train_on_batch(X_train_dis, y_train_dis)

            self.discriminator.trainable = False
            # Train Generator
            loss_gen = self.GAN.train_on_batch(X_train_GAN, y_train_GAN)

            # Print results
            if epoch%save_interval == 0:
                print("Discriminator loss: {0}, Generator loss: {1}".format(loss_dis[0], loss_gen[0]))
                print("Discriminator acc.: {0}, Generator acc.: {1}".format(loss_dis[1], loss_gen[1]))
                self.plot_imgs(epoch)
                
        return 0


gan_model = GAN()
(X_train, _), (_, _) = choose_dataset("computer_vision")

gan_model.train(X_train)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

训练过程中GAN结果图像是相同的 的相关文章

随机推荐

  • R 按选定行号动态分割数据帧/子集 - 解析文本网格 praat

    我正在尝试处理一个名为的 分段文件 TextGrid 由 Praat 程序生成 原始格式如下所示 File type ooTextFile Object class TextGrid xmin 0 xmax 243 761375 tiers
  • Django - 迁移外键字段类型与当前类型不匹配

    我正在使用 MSSQL 数据库 并且在 Django 进入演出之前我已经创建了一些表 因此检查数据库我得到了模型managed False元选项 然后我创建了其他与 Django 迁移相关的内容 这些模型是这样的 class ModelAl
  • Windows UAC 对话框

    我有一个没有资源的应用程序 根本没有资源 所以也没有 UAC 清单 该应用程序使用 CopyFile 将自身安装到 appdata roaming 文件夹中 它还设置自动启动 以便每次启动时自动启动 现在 每次启动电脑时 都会弹出 UAC
  • is_assignable<> 的结果不一致[重复]

    这个问题在这里已经有答案了 可能的重复 is convertible is assignable 和 有什么区别 https stackoverflow com questions 13952404 what is the differen
  • Rails 3 邮件发送问题

    我正在使用 Rails 3 并实现电子邮件发送功能 我不确定我的配置是否正确 但这是我的代码 邮件程序 user mailer rb class UserMailer lt ActionMailer Base default from gt
  • 组件测试中的角度单击选择选项

    我已尝试以下操作来尝试单击选择下拉列表中的选项 但没有任何效果 selectEl fixture debugElement query By css dropdown selectEl nativeElement options 3 nat
  • 如何使用博主视频作为 iframe(错误 400)

    我有一个网站 我使用博客中托管的视频作为 iframe 代码如下所示 多年来它运行得很好 但目前它显示一条错误消息 Bad Request Error 400 但现在博主需要令牌才能观看博主上托管的视频 链接现在如下所示 https www
  • 如何使用执行选择器在特定时间段后将函数与参数联系起来

    我是这个 iPhone 应用程序编程的新手 我有一个函数 其参数类型作为结构指针 如下所示 void responce structurePtr someData 我想使用调用这个函数performselector method5秒的时间间
  • ES6 模块如何作为 Node 中的脚本运行?

    ES6 模块如何作为 Node 中的脚本运行 当我尝试这个 shebang 时 我收到一个错误 usr bin env node experimental modules usr bin env node experimental modu
  • 暂停线程的执行而不休眠?

    我正在使用 Skype API 它每次收到一条消息都会发回一条消息 我不确定这是否真的is是什么原因造成的 但这是我能得到的最接近的结果 当我发送太多消息时 COM 控件无法处理所有回复 这会导致整个应用程序崩溃 当我使用时会发生这种情况f
  • 为什么 Silverlight 不处理我的自定义浮点属性的转换

    在 Silverlight 4 项目中 我有一个扩展 Canvas 的类 public class AppendageCanvas Canvas public float Friction get set public float Rest
  • 如何计算 pandas 中事件之间的时间

    原始问题 我陷入了以下问题 我试图找出车辆在工厂存放的具体时间和时间 我有一个 Excel 工作表 其中存储了所有事件 这些事件要么是交付路线 要么是维护事件 最终目标是获得一个数据帧 其中给出了车辆登记号以及相应的到达工厂和在那里花费的时
  • GWT - DialogBox.center() 无法正常工作

    我的页面上有一个带有按钮的表格 按钮太多了 我有一个滚动条可以向下滚动表格 按钮 onClick 生成一个对话框 其中包含滚动面板 内容和用于关闭该对话框的按钮 我使用 DialogBox center 将其居中 当我按下表格中的第一个按钮
  • 如何将模拟器连接到 laravel 服务器 localhost:8000

    当我的 Android 应用程序使用 10 0 0 2 8080 连接到 wampserver 中的项目时 我可以连接到 localhost 8080 但我使用 laravel 并且我的 Web 服务位于 localhost 8000 我想
  • Bootstrap 响应式附加菜单

    我想要一个固定菜单 如引导文档 http twitter github com bootstrap base css html 与引导文档上一样 它没有贴在手机上 我有以下代码 div class container div class r
  • 为什么我应该将实现的接口方法声明为“公共”?

    interface Rideable String getGait public class Camel implements Rideable int weight 2 String getGait return mph lope voi
  • 如何在 Windows 10 Powershell 上使用 npm 脚本递归复制整个目录?

    如何在 Windows 10 Powershell 上使用 npm 脚本递归复制整个目录 现在我有以下树 test 1 package json 2 src asd txt asd asd Copy 2 txt asd Copy txt a
  • 如何从通过 Javascript 加载的页面上 __scrape__ 数据

    我想使用 beautifulsoup 刮掉此页面上的评论 https www x s com video id the suburl 评论通过 JavaScript 在点击时加载 评论是分页的 每个页面也会在点击时加载评论 我希望获取所有评
  • Eclipse 的选项卡双击 Visual Studio?

    在 Eclipse 上 每当我双击选项卡时 它就会填充工作区 通过隐藏所有其他视图 如项目树 控制台等 有没有办法在 Visual Studio 上做到这一点 注意 我不是在寻找全屏 只是想要一种整理工作区但仍然可以访问菜单的方法 你在追寻
  • 训练过程中GAN结果图像是相同的

    我正在尝试在 MNIST 数据集上训练 GAN 该代码现在的训练结果好坏参半 问题似乎是生成的图像实际上都是相同的 您可以在下面找到我的完整代码 我尝试环顾四周 看看是否有解决方案 我发现唯一提到的使用randn代替rand但我没有使用ra