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

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

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

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

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

Python

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

Q&A

0回答

304閲覧

[Python][Keras]VAEの潜在変数空間結果にうまく違いが現れません。何が原因なのかご教授お願い致します。

DaimaruY

総合スコア1

Keras

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

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

Python

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

0グッド

0クリップ

投稿2022/11/16 11:32

前提

初学者なので至らない点があると思います、申し訳ございません。

PythonでKerasを用いて機械学習(VAE(Variational AutoEncoder))をGooglecolab上で行いました。
Mnistデータセットではなく、オリジナル画像(1100枚)でVAEを実行し、潜在変数空間を可視化したところ、潜在変数内で出力画像にあまり変化が見られませんでした。

この原因が分からず、質問させていただきました。

原因として私が考えたもの
①Mnistデータセットと比べるとサンプル数が少ない
②サンプル画像に見た目の差異が少ない
③(256×256ピクセルのとき)CNNの構造が上手くいっていない
のどれかであると考えました。
ご教授いただければ幸いです。

実現したいこと

上手く潜在変数空間で変化している出力結果を得たい。

発生している問題・エラーメッセージ

該当のソースコード

Python(Google

1#①(Mnistと同様に28×28ピクセルでサンプル画像を加工したもの) 2from tensorflow import keras 3from tensorflow.keras import layers 4 5latent_dim = 2 6 7encoder_inputs = keras.Input(shape=(28, 28, 1)) 8x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(encoder_inputs) 9x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x) 10x = layers.Flatten()(x) 11x = layers.Dense(16, activation="relu")(x) 12z_mean = layers.Dense(latent_dim, name="z_mean")(x) 13z_log_var = layers.Dense(latent_dim, name="z_log_var")(x) 14encoder = keras.Model(encoder_inputs, [z_mean, z_log_var], name="encoder") 15 16encoder.summary() 17 18import tensorflow as tf 19class Sampler(layers.Layer): 20 def call(self, z_mean, z_log_var): 21 batch_size = tf.shape(z_mean)[0] 22 z_size = tf.shape(z_mean)[1] 23 epsilon = tf.random.normal(shape=(batch_size, z_size)) 24 return z_mean + tf.exp(0.5 * z_log_var) * epsilon 25 26latent_inputs = keras.Input(shape=(latent_dim,)) 27x = layers.Dense(7 * 7 * 64, activation="relu")(latent_inputs) 28x = layers.Reshape((7, 7, 64))(x) 29x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(x) 30x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x) 31decoder_outputs = layers.Conv2D(1, 3, activation="sigmoid", padding="same")(x) 32decoder = keras.Model(latent_inputs, decoder_outputs, name="decoder") 33 34decoder.summary() 35 36class VAE(keras.Model): 37 def __init__(self, encoder, decoder, **kwargs): 38 super().__init__(**kwargs) 39 self.encoder = encoder 40 self.decoder = decoder 41 self.sampler = Sampler() 42 self.total_loss_tracker = keras.metrics.Mean(name="total_loss") 43 self.reconstruction_loss_tracker = keras.metrics.Mean( 44 name="reconstruction_loss") 45 self.kl_loss_tracker = keras.metrics.Mean(name="kl_loss") 46 47 @property 48 def metrics(self): 49 return [self.total_loss_tracker, 50 self.reconstruction_loss_tracker, 51 self.kl_loss_tracker] 52 53 def train_step(self, data): 54 with tf.GradientTape() as tape: 55 z_mean, z_log_var = self.encoder(data) 56 z = self.sampler(z_mean, z_log_var) 57 reconstruction = decoder(z) 58 reconstruction_loss = tf.reduce_mean( 59 tf.reduce_sum( 60 keras.losses.binary_crossentropy(data, reconstruction), 61 axis=(1, 2) 62 ) 63 ) 64 kl_loss = -0.5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)) 65 total_loss = reconstruction_loss + tf.reduce_mean(kl_loss) 66 grads = tape.gradient(total_loss, self.trainable_weights) 67 self.optimizer.apply_gradients(zip(grads, self.trainable_weights)) 68 self.total_loss_tracker.update_state(total_loss) 69 self.reconstruction_loss_tracker.update_state(reconstruction_loss) 70 self.kl_loss_tracker.update_state(kl_loss) 71 return { 72 "total_loss": self.total_loss_tracker.result(), 73 "reconstruction_loss": self.reconstruction_loss_tracker.result(), 74 "kl_loss": self.kl_loss_tracker.result(), 75 } 76#ファイルからサンプル画像を取り出し、28×28に加工 77from IPython.display import Image, display 78import glob 79import os 80import re 81import cv2 82import numpy as np 83x=glob.glob('{}/*.png'.format("2dplot_Wing_ex_1100")) 84image_28 = [] 85for i in x: 86 img = cv2.imread(i) 87 img_gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 88 img_gray_28=cv2.resize(img_gray,(28,28)) 89 img_gray_asarray_28 = np.asarray(img_gray_28) 90 image_28.append(img_gray_asarray_28) 91 92image_np_array_2828=np.array(image_28) 93(x_train), (x_test) = image_np_array_2828[:-100],image_np_array_2828[-100:]#1100枚の内train1000枚、test100枚 94x_train = x_train.astype('float32') / 255. 95x_train = np.reshape(x_train, (len(x_train), 28, 28)) 96x_test = x_test.astype('float32') / 255. 97x_test = np.reshape(x_test, (len(x_test), 28, 28)) 98 99import numpy as np#学習 100mnist_digits = np.concatenate([x_train, x_test], axis=0) 101mnist_digits = np.expand_dims(mnist_digits, -1).astype("float32") / 255 102vae = VAE(encoder, decoder) 103vae.compile(optimizer=keras.optimizers.Adam(), run_eagerly=True) 104vae.fit(mnist_digits, epochs=30, batch_size=10) 105 106import matplotlib.pyplot as plt 107 108n = 20 109digit_size = 28 110figure = np.zeros((digit_size * n, digit_size * n)) 111 112grid_x = np.linspace(-1, 1, n) 113grid_y = np.linspace(-1, 1, n)[::-1] 114 115for i, yi in enumerate(grid_y): 116 for j, xi in enumerate(grid_x): 117 z_sample = np.array([[xi, yi]]) 118 x_decoded = vae.decoder.predict(z_sample) 119 digit = x_decoded[0].reshape(digit_size, digit_size) 120 figure[ 121 i * digit_size : (i + 1) * digit_size, 122 j * digit_size : (j + 1) * digit_size, 123 ] = digit 124#潜在変数空間可視化 125plt.figure(figsize=(30, 30)) 126start_range = digit_size // 2 127end_range = n * digit_size + start_range 128pixel_range = np.arange(start_range, end_range, digit_size) 129sample_range_x = np.round(grid_x, 1) 130sample_range_y = np.round(grid_y, 1) 131plt.axis("off") 132plt.imshow(figure, cmap="Greys_r") 133 134#②(256×256ピクセルでサンプル画像を加工) 135#エンコーダ部分 136from tensorflow import keras 137from tensorflow.keras import layers 138 139latent_dim = 2 140 141encoder_inputs = keras.Input(shape=(256, 256, 1)) 142x = layers.Conv2D(32, 3, activation="relu", strides=2, padding="same")(encoder_inputs) 143x = layers.Conv2D(64, 3, activation="relu", strides=2, padding="same")(x) 144x = layers.Flatten()(x) 145x = layers.Dense(16, activation="relu")(x) 146z_mean = layers.Dense(latent_dim, name="z_mean")(x) 147z_log_var = layers.Dense(latent_dim, name="z_log_var")(x) 148encoder = keras.Model(encoder_inputs, [z_mean, z_log_var], name="encoder") 149#デコーダ部分 150latent_inputs = keras.Input(shape=(latent_dim,)) 151x = layers.Dense(64 * 64 * 64, activation="relu")(latent_inputs) 152x = layers.Reshape((64, 64, 64))(x) 153x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(x) 154x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x) 155decoder_outputs = layers.Conv2D(1, 3, activation="sigmoid", padding="same")(x) 156decoder = keras.Model(latent_inputs, decoder_outputs, name="decoder") 157#画像を加工し、代入する部分 158from IPython.display import Image, display 159import glob 160import os 161import re 162import cv2 163import numpy as np 164 165x=glob.glob('{}/*.png'.format("2dplot_Wing_ex_1100")) 166image_256 = [] 167for i in x: 168 img = cv2.imread(i) 169 img_gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 170 img_gray_256=cv2.resize(img_gray,(256,256)) 171 img_gray_asarray_256 = np.asarray(img_gray_256) 172 image_256.append(img_gray_asarray_256) 173image_np_array_256256=np.array(image_256) 174(x_train), (x_test) = image_np_array_256256[:-100],image_np_array_256256[-100:] 175x_train = x_train.astype('float32') / 255. 176x_train = np.reshape(x_train, (len(x_train), 256, 256)) 177#print(x_train.shape) →(300, 256, 256) 178x_test = x_test.astype('float32') / 255. 179x_test = np.reshape(x_test, (len(x_test), 256, 256)) 180#潜在変数のdigit_size=256に変更

試したこと

・epochやbatchsizeは色々変えて試しましたが、あまり変化は得られなかった。
・256×256ピクセルのデコーダ、エンコーダ層の構造があやしい?あまり詳しくないため、すみません

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

・各サンプル画像は下記4つの図形を係数を少しずつ変化させてサンプル画像(各350枚用意した(matplotlibで))イメージ説明
イメージ説明
イメージ説明
イメージ説明
・28×28(epoch30、batchsize40)の潜在変数空間可視化イメージ説明
・256×256(epoch30、batchsize40)の潜在変数空間可視化イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PondVillege

2022/12/06 20:38 編集

最後の画像2枚は本当に潜在変数空間を可視化したものですか?再構成画像を可視化したようにしか見えませんが,どうなのでしょう. また,class VAEでは train_step() で reconstruction = decoder(z) としており,VAEに渡してないdecoderを利用していると考えられます.self.decoder(z) にしてください.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問