GAN(Generative Adversarial Networks)

GAN (Generative Adversarial Networks)

ジェネラティブAIを見たので、実際にどのように生成されているのか見てみましょう!

IMAGE SOURCE: BY AUTHOR

イントロダクション:

GAN(ジェネラティブ対抗ネットワーク)について、まずGANとは何かを理解しましょう。すでにジェネラティブAIに関するブログを書いており、AIの種類、AIのブーム、なぜAIが現在あらゆる分野でヘルスケア、金融、取引、マーケティングなどに傾斜しているのかについて議論しています。しかし、このAIがどのようにしてそうしたような似たような画像、魅力的な色や聞いていて心地よい音楽を生成できるのでしょうか? GANは深層学習の一部であり、Ian Goodfellowと彼の共同研究者によって2014年に導入されました。その後、GANは多くの研究者の目を引き、多くの研究結果をもたらし、AIの創造性と人工知能の境界を再定義するのに役立ちました。

1.1 GANとは何か、そしてどのように機能するのか

では、合成データについて聞いたことがありますか?はい、それなら素晴らしいです。もし答えがノーなら心配はありません。合成データは、実際のデータが利用できないときに、アルゴリズムによって生成される真のデータではないデータです。合成データを偽のデータセットと考えることもできます。しかし、もちろん、それはどのように生成されるのでしょうか?手続きは何ですか?アルゴリズムと言いましたか?具体的にはどのようなアルゴリズムですか?答えは、GANです。はい、生成タスクに使用される深層学習モデルの一部であり、ディープフェイク映画から似たような写真、あらゆるものの偽のデータセットまで、ほぼすべての偽物を作成します。

IMAGE SOURCE: https://developers.google.com/machine-learning/gan/gan_structure

GANは2つの主要なニューラルネットワークで構成されています:

  1. ジェネレータ

2. ディスクリミネータ:

ジェネレータ:

ジェネレーターネットワークはランダムノイズを入力とし、ランダムを完全にランダムな偽のデータとみなし、それを元のデータまたはそのターゲット分布に似たデータに変換しようとします。画像の例を考えてみましょう。画像データセットを扱う場合、このネットワークは、入力として与えられた元のデータセットにまったく同じような画像を生成しようとしますが、それらは完全に生成された偽物です。つまり、このネットワークは、バックプロパゲーションと勾配降下法を使用して、ノイズベクトルをデータサンプルにマッピングする方法を学習します。

ディスクリミネータ:

一方、ディスクリミネータネットワークは、ジェネレータによって生成された偽のデータと元のデータセットからの実際のデータを区別しようとする分類器として機能します。これにより、ディスクリミネータは真のデータを高い確率で、偽のデータを低い確率で与える方法を学習します。

IMAGE SOURCE: https://i0.wp.com/neptune.ai/wp-content/uploads/2022/10/fig2-Generator-and-Discriminator.png?ssl=1

GANのトレーニングは、これら2つのネットワークの間での行ったり来たりの戦いから成り立ちます。以下がその動作方法です:

トレーニングフェーズ:

  • ジェネレータはランダムノイズから偽のデータを生成します。
  • ディスクリミネータは実際のデータと偽のデータの両方を評価し、確率を割り当てます。
  • ディスクリミネータの目的は、真のデータと偽のデータを識別する能力を向上させることで、分類の正確性を高めることです。
  • ジェネレータの目的は、「騙す」ために十分に魅力的なデータを生成することです。ジェネレータはその設定を変更して、ディスクリミネータが実際のデータと認識する可能性が高いデータを提供します。

競争フェーズ:

  • ジェネレータは新鮮な架空のデータを生成します。
  • ディスクリミネータは新鮮な偽のデータを実際のデータと比較します。
  • ディスクリミネータの増加した分類能力により、新しい偽のデータをより良く識別できるようになることがあります。
  • ジェネレータはより魅力的な結果を作成するためにパラメータを修正します。

この反復的な手順は、ジェネレータが実際のデータと区別できないデータを生成するか、停止要件が満たされるまで繰り返されます。

GANの成功は、ジェネレータとディスクリミネータのバランスを取ることに依存しています。ジェネレータは現実的なデータを生成する能力を高め、ディスクリミネータは真偽のデータを識別する能力を向上させることが重要です。GANはトレーニングデータから微妙なパターンや分布を捉えることで、画像生成、スタイル変換、データ拡張など、さまざまな分野で優れた結果を示しています。

GANアーキテクチャの数学的背後について説明した最もクールなビデオはこちらです。興味があればぜひご覧ください:https://youtu.be/Gib_kiXgnvA

プロジェクトPROを通じて、生成的対抗ネットワーク(GAN)と深層ニューラルネットワークのダイナミックな世界に足を踏み入れましょう。理論的な説明に加えて、このプラットフォームは包括的な学習体験を提供し、理解力と実際の応用の両方を含んでいます。

プロジェクトPROでは、単なる受講者ではなく、GANや深層ニューラルネットワークの創造と微調整に積極的に参加します。モデルアーキテクチャの概念化からコーディング、実際のデータセットの使用まで、開発のすべての段階を案内します。画像生成、データ拡張、他のGANの応用に興味がある場合でも、プロジェクトPROにはアイデアを実現するためのツールとリソースがあります。このインタラクティブな学習プラットフォームを使用すると、自分の能力を向上させ、自分のペースで探索し、創造的な考えを現実にすることができます。

今すぐ訪れてください: https://bit.ly/3OlIGoF

2. GANの利点:

SOURCE: https://giphy.com/

生成的対抗ネットワーク(GAN)の内部機能について学んだところで、他の深層ニューラルネットワーク手法に比べてGANが持つ特定の利点を見てみましょう。これらの利点は、画像生成、データ拡張、画像変更を超えて、人工知能と創造的な応用のフロンティアを em>推進するGANの特異な能力を示しています。

2.1 高品質な画像生成:

GANの驚くべき能力の1つは、本物の写真に非常に近い高品質の画像を作成することです。ジェネレータネットワークはデータセットの複雑なパターンと構造を学習することにより、驚くほどリアルな視覚的表現を生み出します。これは美術、デザイン、エンターテイメントなどの分野で大きな可能性を持っており、想像力の限界を em>超えるリアルな画像の制作を可能にします。

2.2 データ拡張と合成:

GANは、機械学習モデルの効率向上において重要な役割を果たしています。データ拡張として知られるこの手法は、トレーニングデータセットの多様性を高める追加のインスタンスの作成を含みます。GANは、元の分布を正確に表現するデータを提供することで、この領域で優れた結果を生み出します。データが不足している場合に特に有用であり、モデルの汎化とパフォーマンスに役立ちます。

2.3 スタイル変換と画像間変換

GANは、スタイル変換や画像間変換などの応用を可能にする、画像のスタイルや内容を変更するユニークな能力を持っています。スタイル変換では、GANは1つの画像の創造的なスタイルを別の画像に移し、内容を維持します。画像間変換では、GANは衛星画像を地図に、白黒写真をカラー画像に変換するなど、画像を1つのドメインから別のドメインに変換します。この柔軟性は、さまざまな業界で創造的な表現と実用的なソリューションの可能性を広げます。

GANの強みは、これらの課題に対して創造性と優雅さで対処する能力にあり、これにより人工知能と創造的なテクノロジーの未来を創り出す力となっています。

GANの実世界での利用事例:

SOURCE: https://giphy.com/

GANの基礎を習得した後は、その能力が輝く多くの実世界の応用について見てみましょう。GANは、AIによる芸術作品やデザイン、例えば「エドモン・ド・ベラミーの肖像画」のような興味深い作品を生み出しています。また、GANはNikeなどの有名なファッションブランドが独自のデザインを作り出すために使用されています。さらに、医療分野ではGANが合成医療画像を生成し、リアルタイムで診断AIのトレーニングを向上させています。

NVIDIAは自動運転車の改良を急速に進めるために、複数の運転シナリオを再現しています。建築家はGANを使用してインテリアデザインを可視化し、GANによって生成された没入型環境はビデオゲームの向上に利用されています。GANによるパーソナライズされたファッション提案は、小売体験を向上させます。また、画像の修復、薬剤発見など、他のセクターも再定義されています。GANは芸術、テクノロジー、その他の分野でビジョンを現実に変える触媒です。

GANと遊ぼう: (画像を生成するためのコード)

このGANモデルのコードは、TensorFlowとKerasを使用して、Generative Adversarial Network (GAN) のモデルを構築、トレーニング、結果を視覚化する方法を示しています。コードの主要なコンポーネントをステップごとに見ていきましょう:

SOURCE: https://giphy.com/

ステップ1: データセットの準備とダウンロード:

まず、コードはCelebAデータセットをダウンロードして展開します。このコレクションは、有名人の顔写真で構成されています。写真はインポートされ、前処理されています。範囲は[-1, 1]に正規化されています。

import tensorflow as tffrom tensorflow import kerasfrom tensorflow.keras import layersimport matplotlib.pyplot as pltimport osimport gdownfrom zipfile import ZipFile

os.makedirs("celeba_gan")url = "https://drive.google.com/uc?id=1O7m1010EJjLE5QxLZiM9Fpjs7Oj6e684"output = "celeba_gan/data.zip"gdown.download(url, output, quiet=True)with ZipFile("celeba_gan/data.zip", "r") as zipobj:    zipobj.extractall("celeba_gan")

dataset = keras.utils.image_dataset_from_directory(    "celeba_gan", label_mode=None, image_size=(64, 64), batch_size=32)dataset = dataset.map(lambda x: x / 255.0)

for x in dataset:    plt.axis("off")    plt.imshow((x.numpy() * 255).astype("int32")[0])    break
SOURCE: BY AUTHOR (This would be the output image that we'll be getting after running the above code)

ステップ2: Discriminatorモデルの定義:

LeakyReLUアクティベーションを持つ畳み込み層のシーケンスを使用して、discriminatorモデルを作成します。discriminatorは、入力画像が本物か偽物(製造されたもの)かを判断しようとします

discriminator = keras.Sequential(    [        keras.Input(shape=(64, 64, 3)),        layers.Conv2D(64, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2D(128, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2D(128, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Flatten(),        layers.Dropout(0.2),        layers.Dense(1, activation="sigmoid"),    ],    name="discriminator",)discriminator.summary()

ステップ3:ジェネレーターモデルの作成:

画像を生成するために、ジェネレーターモデルはランダムな潜在ベクトルを入力として受け取り、徐々にアップサンプリングします。まず、密な層で始まり、その後、出力を4Dテンソルに変換します。

畳み込み転置層は、データをアップサンプリングして、データセットの本物の画像に似た画像を生成します

latent_dim = 128generator = keras.Sequential(    [        keras.Input(shape=(latent_dim,)),        layers.Dense(8 * 8 * 128),        layers.Reshape((8, 8, 128)),        layers.Conv2DTranspose(128, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2DTranspose(256, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding="same"),        layers.LeakyReLU(alpha=0.2),        layers.Conv2D(3, kernel_size=5, padding="same", activation="sigmoid"),    ],    name="generator",)generator.summary()

ステップ4:GANモデルは次のように定義されます:

識別器とジェネレーターGANクラスで結合されます。

それには、discriminatorとgeneratorの両方に対して単一のトレーニングステップを実行するためのtrain_stepメソッドが含まれています。

識別器は実際の画像と偽の画像の違いを判別するようにトレーニングされ、ジェネレーターは識別器を欺く画像を生成するようにトレーニングされます。

トレーニング中に、安定性を向上させるためにランダムノイズがラベルに注入されます。

class GAN(keras.Model):    def __init__(self, discriminator, generator, latent_dim):        super().__init__()        self.discriminator = discriminator        self.generator = generator        self.latent_dim = latent_dim    def compile(self, d_optimizer, g_optimizer, loss_fn):        super().compile()        self.d_optimizer = d_optimizer        self.g_optimizer = g_optimizer        self.loss_fn = loss_fn        self.d_loss_metric = keras.metrics.Mean(name="d_loss")        self.g_loss_metric = keras.metrics.Mean(name="g_loss")    @property    def metrics(self):        return [self.d_loss_metric, self.g_loss_metric]    def train_step(self, real_images):        # 潜在空間内でランダムな点をサンプリングする        batch_size = tf.shape(real_images)[0]        random_latent_vectors = tf.random.normal(shape=(batch_size, self.latent_dim))        # 偽の画像に変換する        generated_images = self.generator(random_latent_vectors)        # 実際の画像と組み合わせる        combined_images = tf.concat([generated_images, real_images], axis=0)        # 実際の画像と偽の画像を識別するためのラベルを組み立てる        labels = tf.concat(            [tf.ones((batch_size, 1)), tf.zeros((batch_size, 1))], axis=0        )        # ラベルにランダムノイズを追加する-重要なトリック!        labels += 0.05 * tf.random.uniform(tf.shape(labels))        # 識別器を訓練する        with tf.GradientTape() as tape:            predictions = self.discriminator(combined_images)            d_loss = self.loss_fn(labels, predictions)        grads = tape.gradient(d_loss, self.discriminator.trainable_weights)        self.d_optimizer.apply_gradients(            zip(grads, self.discriminator.trainable_weights)        )        # 潜在空間内でランダムな点をサンプリングする        random_latent_vectors = tf.random.normal(shape=(batch_size, self.latent_dim))        # "すべての実際の画像"というラベルを組み立てる        misleading_labels = tf.zeros((batch_size, 1))        # ジェネレーターを訓練する(注:識別器の重みを更新してはいけない!)        with tf.GradientTape() as tape:            predictions = self.discriminator(self.generator(random_latent_vectors))            g_loss = self.loss_fn(misleading_labels, predictions)        grads = tape.gradient(g_loss, self.generator.trainable_weights)        self.g_optimizer.apply_gradients(zip(grads, self.generator.trainable_weights))        # メトリックスを更新する        self.d_loss_metric.update_state(d_loss)        self.g_loss_metric.update_state(g_loss)        return {            "d_loss": self.d_loss_metric.result(),            "g_loss": self.g_loss_metric.result(),        }

ステップ5:可視化カスタムコールバック:

各エポックの終了時に、GANMonitorクラスは生成された画像の少数を作成し記録します。これらのグラフィックは、トレーニング中の生成器の進捗を示しています。

class GANMonitor(keras.callbacks.Callback):    def __init__(self, num_img=3, latent_dim=128):        self.num_img = num_img        self.latent_dim = latent_dim    def on_epoch_end(self, epoch, logs=None):        random_latent_vectors = tf.random.normal(shape=(self.num_img, self.latent_dim))        generated_images = self.model.generator(random_latent_vectors)        generated_images *= 255        generated_images.numpy()        for i in range(self.num_img):            img = keras.utils.array_to_img(generated_images[i])            img.save("generated_img_%03d_%d.png" % (epoch, i))

ステップ6:コンパイルとトレーニング:

GANモデルは、バイナリクロスエントロピー損失とAdamオプティマイザを使用してコンパイルされます。モデルをトレーニングするためには、gan.fitメソッドが使用されます。セレブリティの顔画像データセットがトレーニングに使用されます。

GANMonitorコールバックは、各エポックの後に生成された画像を保存するために使用されます。

ステップ7:トレーニングループと可視化:

トレーニング中、GANはディスクリミネータとジェネレータを交互に更新します。

ディスクリミネータは、実際の画像と生成された画像を正しく分類しようとします。一方、ジェネレータは、ディスクリミネータを欺くことができる画像を作成しようとします。生成された画像は、GANMonitorコールバックを使用して各エポックの後に保存されます。

コード参照:https://keras.io/examples/generative/dcgan_overriding_train_step/

ソース:https://keras.io/examples/generative/dcgan_overriding_train_step/(これは30エポックの出力画像であり、エポック数が増えると品質が向上します)

ソーシャルメディアプラットフォームでフォローし、ご意見を共有するのを忘れないでください。AI愛好家のコミュニティに参加し、一緒にジェネレーティブAIの限界を押し上げ続けましょう。一緒に素晴らしいことを成し遂げることができます!🔐❤️

データサイエンスとサイバーセキュリティのためのLinkedInグループに参加してください!最新のマテリアルブログ、独占コンテンツ、仲間の愛好家を見つけることができます。🔥

グループのリンク: https://www.linkedin.com/groups/9378874/

ソース:https://giphy.com/

同じ楽しさでデータサイエンスのブログや記事を学ぶために私たちに従ってください:💙

メールID: [email protected]

LinkedIn: https://www.linkedin.com/company/dsmcs/

Instagram: https://www.instagram.com/datasciencemeetscybersecurity/?hl=en

Github: https://github.com/Vidhi1290

Twitter: https://twitter.com/VidhiWaghela

VoAGI: https://medium.com/@datasciencemeetscybersecurity-

ウェブサイト: https://www.datasciencemeetscybersecurity.com/

— データサイエンスとサイバーセキュリティのチーム 💙❤️

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

PyTorchを使った効率的な画像セグメンテーション:Part 2

これは、PyTorchを使用してディープラーニング技術を使ってゼロから画像セグメンテーションをステップバイステップで実装する...

人工知能

X / Twitterでお金を稼ぐ方法

X(別名Twitter)は、クリエイターに広告収益の一部を支払い始めましたここでは、その一部を手に入れる方法を紹介します

データサイエンス

グラフニューラルネットワークによるローマ数字の分析

『この記事では、自動和声分析のモデル開発の過程を説明したいと思います個人的には音楽を深く理解することに興味があります...

機械学習

「OpenAIは、パーソナライズされたAIインタラクションのためのChatGPTのカスタムインストラクションを開始」

OpenAIは、AI言語モデルChatGPTのユーザーコントロールを向上させるために、新しい機能「カスタムインストラクション」を導入...

人工知能

「プログラマーを支援するためにコードを生成できる10つのAIツール」

無限の可能性の時代において、生成型人工知能ソリューションの広範な使用と革新的なアクセス可能性は、プログラマーにとって...

データサイエンス

「データ管理におけるメタデータの役割」

「メタデータは現代のデータ管理において中心的な役割を果たし、統合、品質、セキュリティに不可欠であり、デジタルトランス...