質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

DCGANの学習が停滞してしまう

fk_beginner
fk_beginner

総合スコア15

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0リアクション

0クリップ

321閲覧

投稿2022/09/19 15:05

編集2022/09/20 02:33

前提

pythonとkerasを用いて128*128の猫の顔画像を生成するDCGANを作成しています。
学習データとしてkaggleのCATデータセットから顔の部分を抽出して利用しています。イメージ説明
https://www.kaggle.com/datasets/crawford/cat-dataset
本やサイトを参考にしながら実装してみたのですが、500バッチほど学習させたあたりから生成結果にほとんど変化がなくなってしまいます。

初期状態
学習前の生成画像
500バッチ学習後
イメージ説明

5000バッチ学習後
イメージ説明

学習のログを見ると、バッチ数が一定を超えると識別器Dと生成器Gの損失関数の値lossがほとんどゼロになっていることで重みが更新されていないことがわかります。

log

3342 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000055] 3343 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000006] 3344 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000045] 3345 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000082] 3346 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000120] 3347 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000083] 3348 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000016] 3349 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000048] 3350 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000042] 3351 [D loss: 0.000001, acc.: 100.00%] [G loss: 0.000153] 3352 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000104] 3353 [D loss: 0.000000, acc.: 100.00%] [G loss: 0.000020]

質問

このDCGANの学習を正常に進ませるにはどうすればよいでしょうか?
またこの停滞はなぜ起こっているのでしょうか?(ハイパーパラメーターの調整不足?実装ミス?)

試したこと

初めに実装ミスを疑い様々なサイトの実装例を見比べてみましたが自分では問題を発見できませんでした。

該当のソースコード

python

from keras.layers import Dense, Reshape, Flatten, Dropout from keras.layers import BatchNormalization, Activation, ZeroPadding2D from keras.layers.activation import LeakyReLU from keras.layers.convolutional import UpSampling2D, Conv2D from keras.models import Sequential from keras.optimizers import Adam import pickle from PIL import Image from matplotlib import pyplot as plt import cv2 import numpy as np class DCGAN(): def __init__(self): optimizer = Adam(lr=0.0002, beta_1=0.5) self.discriminator = self.build_discriminator() self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) self.generator = self.build_generator() self.discriminator.trainable = False self.combined = self.build_combined() self.combined.compile(loss='binary_crossentropy', optimizer=optimizer) def build_generator(self): noise_shape = (100,) model = Sequential() model.add(Dense(128 * 32 * 32, activation="relu", input_shape=noise_shape)) model.add(Reshape((32, 32, 128))) model.add(BatchNormalization(momentum=0.8)) model.add(UpSampling2D()) model.add(Conv2D(128, kernel_size=3, padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(momentum=0.8)) model.add(UpSampling2D()) model.add(Conv2D(64, kernel_size=3, padding="same")) model.add(Activation("relu")) model.add(BatchNormalization(momentum=0.8)) model.add(Conv2D(3, kernel_size=3, padding="same")) model.add(Activation("tanh")) model.summary() return model def build_discriminator(self): img_shape = (128,128,3) model = Sequential() model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=img_shape, padding="same")) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.25)) model.add(Conv2D(64, kernel_size=3, strides=2, padding="same")) model.add(ZeroPadding2D(padding=((0, 1), (0, 1)))) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.25)) model.add(BatchNormalization(momentum=0.8)) model.add(Conv2D(128, kernel_size=3, strides=2, padding="same")) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.25)) model.add(BatchNormalization(momentum=0.8)) model.add(Conv2D(256, kernel_size=3, strides=1, padding="same")) model.add(LeakyReLU(alpha=0.2)) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(1, activation='sigmoid')) model.summary() return model def build_combined(self): self.discriminator.trainable = False model = Sequential([self.generator, self.discriminator]) return model def train(self, iterations, batch_size=128, save_interval=50): #生成を確かめる用のノイズベクトル check_noise = noise = np.random.uniform(-1, 1, (9, 100)) #pklファイルから学習する画像データを読み込む with open("./kaggle_cat/data.pkl","rb") as f: X_train = pickle.load(f) #学習する画像データを-1~1に収める X_train = (X_train.astype(np.float32) - 127.5) / 127.5 half_batch = int(batch_size / 2) for iteration in range(iterations): #識別器の学習 real = X_train[np.random.randint(0, 1000, half_batch)] noise = np.random.uniform(-1, 1, (half_batch, 100)) fake = self.generator.predict(noise) d_loss_real = self.discriminator.train_on_batch(real, np.ones((half_batch, 1))) d_loss_fake = self.discriminator.train_on_batch(fake, np.zeros((half_batch, 1))) d_loss = 0.5 * np.add(d_loss_real, d_loss_fake) #生成器の学習 noise = np.random.uniform(-1, 1, (batch_size, 100)) g_loss = self.combined.train_on_batch(noise, np.ones((batch_size, 1))) print("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (iteration, d_loss[0], 100 * d_loss[1], g_loss)) #500バッチごとに結果を入力 if iteration % save_interval == 0: check_img = self.generator.predict(check_noise) check_img = check_img*127.5+127.5 check_img = check_img.astype("uint8") # タイル状に pm × pm 枚配置 pm = 3 # 空の入れ物(リスト)を準備 d = [] for i in range(len(check_img)): img = Image.fromarray(check_img[i]) img = np.asarray(img) #img = cv2.resize(img, (300, 300), cv2.INTER_LANCZOS4) d.append(img) # タイル状に画像を一覧表示 fig, ax = plt.subplots(pm, pm, figsize=(10, 10)) fig.subplots_adjust(hspace=0, wspace=0) for i in range(pm): for j in range(pm): ax[i, j].xaxis.set_major_locator(plt.NullLocator()) ax[i, j].yaxis.set_major_locator(plt.NullLocator()) ax[i, j].imshow(d[pm*i+j], cmap="bone") plt.savefig("./result/"+ str(iteration) + "_result.png") if __name__ == '__main__': dcgan = DCGAN() dcgan.train( iterations=200000, batch_size=32, save_interval=500, )

補足情報(FW/ツールのバージョンなど)

python 3.9.7
keras 2.9.0

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

fk_beginner

2022/09/27 09:24

ネット上のコードや記事で見つけた - 損失関数をhingeにする - 最適化をAdamからRMSpropに変更する という解決策は今回の場合はやってみても変化なしでした。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。