「オートエンコーダを用いたMNIST画像の再構築」
Autoencoder for MNIST image reconstruction
はじめに
インターネット上の情報が非常に多いため、研究者や科学者はより効率的かつ安全なデータ転送方法の開発に取り組んでいます。オートエンコーダは、そのシンプルで直感的なアーキテクチャのために、この目的において貴重なツールとして現れています。通常、オートエンコーダがトレーニングされた後、エンコーダの重みは送信者に、デコーダの重みは受信者に送信することができます。これにより、送信者はデータをエンコードされた形式で送信することができ、時間とコストを節約することができます。一方、受信者は圧縮されたデータを受け取ることができます。この記事では、特にMNIST数値データベースとPythonのPyTorchフレームワークを使用したMNIST画像再構築におけるオートエンコーダの興味深い応用について探求します。
学習目標
- この記事では、MNIST画像をエンコードすることができるTensorFlowオートエンコーダの構築に焦点を当てています。
- データベースの読み込みと処理のための関数を実装し、データポイントの動的な変換を作成します。
- ノイズのある画像と実際の画像を入力として使用して、エンコーダ-デコーダアーキテクチャのオートエンコーダを生成します。
- オートエンコーダの深層学習における重要性、アプリケーションの原則、モデルの性能向上の潜在能力について探求します。
この記事は、データサイエンスブログマラソンの一部として公開されました。
オートエンコーダのアーキテクチャ
オートエンコーダは、主に3つの主要なコンポーネントに分けることができます:
エンコーダ:このモジュールは、トレーニング-検証-テストセットからの入力データを受け取り、それをエンコードされた表現に圧縮します。通常、コーディングされた画像データは入力データよりも小さくなります。
- 「著者たちの大群がAI企業に対して、彼らの作品でモデルのトレーニングを止めるよう訴えている」
- 「AIのリスクにより、国連安全保障理事会が開催される」
- 「10000 DALL-Eのクレジットでは買えない、Pythonで創った生成アートの方法」
ボトルネック:ボトルネックモジュールは、知識表現を圧縮し、ネットワークの重要な部分として保持します。データの次元は縮小の障壁となります。
デコーダ:デコーダモジュールは、データ表現を「解凍」して元の形式に復元することが重要です。デコーダからの出力は、グラウンドトゥルースまたは初期の入力データと比較されます。
デコーダモジュールは、データの表示を「解凍」し、エンコードされた形式で再構築するのに役立ちます。デコーダの出力は、グラウンドトゥルースまたは元の入力データと比較されます。
エンコーダ、ボトルネック、デコーダの関係
エンコーダ
エンコーダは、プーリングモジュールと畳み込みブロックを介して入力データを圧縮することで重要な役割を果たします。この圧縮により、ブロックと呼ばれるコンパクトな画像が生成されます。
エンコーダの後には、デコーダがあります。デコーダは入力データを再構築するための高レベルモジュールで構成されており、ノイズの削減に関係なく、入力と似たような出力を再構築することを目指します。MNIST画像のオートエンコーダを使用した画像再構築
ただし、可変オートエンコーダの場合、入力は入力の再構築ではありません。代わりに、モデルに与えられた入力データに基づいて、完全に新しい画像を作成します。この違いにより、可変オートエンコーダは結果の画像にある程度の制御を持つことができ、異なる結果を生成することができます。
ボトルネック
ボトルネックは神経系の最小部分ですが、非常に重要な役割を果たしています。エンコーダからデコーダへのデータのフローを制限する重要な要素として機能し、最も重要なデータのみが通過することができます。フローを制限することで、バリアは重要な特性を保存し、回復に使用します。
これにより、入力の知識の種類を表現することができます。エンコーダ-デコーダの構造により、画像から貴重な情報を抽出し、ネットワーク内のさまざまな入力間の意味のあるつながりを作成することが可能となります。
この圧縮形式の処理により、神経系が入力を記憶し、情報の過剰負荷を防ぐことができます。一般的なガイドラインとして、バリアが小さいほど余分なリスクが低くなります。
ただし、非常に小さなバッファは格納できるデータ量を制限する可能性があり、エンコーダのプール層を介して重要なデータが失われる可能性が高くなります。
デコーダ
デコーダは、アップリンクと畳み込みブロックから構成され、出力の再構築を行います。
圧縮表現を受け取ったデコーダは、「解凍機」となります。デコーダの役割は、圧縮された画像から抽出された隠れた特性に基づいて、画像を再構築することです。この隠れた特性を使用することで、デコーダはエンコーダによって行われた圧縮プロセスを逆にして画像を効果的に再構築します。
オートエンコーダのトレーニング方法
オートエンコーダを設定する前に、以下の4つの重要なハイパーパラメータがあります:
- コードのサイズ:コードのサイズ、またはブロックのサイズとも呼ばれるものは、オートエンコーダのチューニングにおいて重要なハイパーパラメータです。データの圧縮レベルを指定します。さらに、コードのサイズは正則化項として機能することもあります。
- 複数の層:他のニューラルネットワークと同様に、エンコーダとデコーダの深さはオートエンコーダの重要なハイパーパラメータです。深さを増すとモデルの複雑さが増し、深さを減らすと処理速度が向上します。
- 各層のポイント数:各層のポイント数は、各層で使用されるウェイトを決定します。通常、オートエンコーダを進むにつれて、次の層ではポイント数が減少し、入力が減少することを示します。
- 損失の回復:オートエンコーダをトレーニングするための損失関数の選択は、望ましい入出力の適応に依存します。画像データを扱う場合、再構築用の一般的な損失関数には平均二乗誤差(MSE)損失やL1損失があります。入力と出力が[0,1]の範囲内にある場合、バイナリクロスエントロピーも再構築の損失として使用することができます(例えば、MNIST)。
必要なもの
オートエンコーダをTensorflowで作成するために、このライブラリとヘルパー関数が必要です。
Tensorflow:まず、Tensorflowライブラリとモデルの作成に必要なすべてのコンポーネントをインポートする必要があります。これにより、MNIST画像を読み込み、生成することができるようになります。
NumPy:次に、数値処理の強力なライブラリであるNumPyをインポートします。これを使用してデータベースの前処理や再構成を行います。
Matplotlib:モデルのパフォーマンスを視覚化し評価するために、Matplotlibのプロットライブラリを使用します。
- data_proc(dat)関数は、ヘルパー関数としてデータを受け取り、モデルで必要なサイズにリサイズします。
- gen_noise(dat)ヘルパー関数は、配列を入力として受け取り、ガウスノイズを適用し、結果の値が(0,1)の範囲内に収まるようにします。
- Two Arrays関数は、入力配列と予測画像の配列を受け取り、それらを2つの行に配置します。
オートエンコーダの構築
次のパートでは、TensorFlowを使用してシンプルなオートエンコーダを作成し、MNIST画像をトレーニングする方法を学びます。まず、要件を満たすためにMNISTデータを読み込み、処理する手順を概説します。データが適切にフォーマットされたら、モデルを構築してトレーニングします。
ネットワークのアーキテクチャは、エンコーダ、ボトルネック、デコーダの3つの主要なコンポーネントで構成されています。エンコーダは入力画像を圧縮し、貴重な情報を保持します。ボトルネックは、デコーダを通過するために重要な特徴を決定します。最後に、デコーダはボトルネックの結果を使用して画像を再構成します。この再構築プロセスでは、オートエンコーダはデータの隠れた位置を学習することを目指しています。
いくつかのライブラリをインポートし、モデルを作成するためのいくつかの関数を記述する必要があります。TensorFlowライブラリを使用して関連するコンポーネントとともにインポートします。また、数値処理ライブラリであるNumPyとプロットライブラリであるMatplotlibもインポートします。これらのライブラリは、いくつかの操作を実行し、結果を視覚化するのに役立ちます。
ライブラリのインポート
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.layers import *
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Model
さらに、いくつかの補助的な関数の実装も必要です。初期化関数は、配列を入力として受け取り、モデルで必要なサイズに変更します。
def data_proc(dat):
larr = len(dat)
return np.reshape(dat.astype("float32") /255.0 , (larr, 28,28,1))
また、配列に作用する二つ目のヘルパー関数も追加する必要があります。この関数は配列にガウスノイズを追加し、結果の値が0から1の範囲になるようにします。
def gen_noise(dat):
return np.clip(dat + 0.4 * np.random.normal(loc=0.0, scale=1.0, size=dat.shape), 0.0, 1.0)
モデルのパフォーマンスの評価
モデルのパフォーマンスを評価するためには、多数の画像を視覚化することが重要です。そのために、投影された画像のセットとそれらを2行に配置する第3の関数を受け取る入力関数を使用することができます。
def display(dat1, dat2):
ind = np.random.randint(len(dat1), size=10)
im1 = dat1[ind, :]
im2 = dat2[ind, :]
for i, (a, b) in enumerate(zip(im1, im2)):
plt_axis = plt.subplot(2, n, i + 1)
plt.imshow(a.reshape(28, 28))
plt.gray()
plt_axis.get_xaxis().set_visible(False)
plt_axis.get_yaxis().set_visible(False)
plt_axis = plt.subplot(2, n, i + 1 + n)
plt.imshow(b.reshape(28, 28))
plt.gray()
plt_axis.get_xaxis().set_visible(False)
plt_axis.get_yaxis().set_visible(False)
plt.show()
データセットの準備
MNISTデータセットはTensorFlowで提供されており、トレーニングデータセットとテストデータセットに分割されています。このデータベースを直接ロードし、前に定義したデフォルトの処理関数を使用することができます。さらに、元のMNIST画像の後半の入力データにノイズのバージョンを生成するために、前に定義したgen_noise関数を使用します。入力ノイズレベルは画像の歪みに影響を与えるため、モデルの再構築でうまく動作するのが難しくなります。元の画像とノイズをプロセスの一部として想像します。
(ds_train, _), (ds_test, _) = mnist.load_data()
ds_train,ds_test = data_proc(ds_train), data_proc(ds_test)
noisy_ds_train, noisy_ds_test = gen_noise(ds_train), gen_noise(ds_test)
display(ds_train, noisy_ds_train)
エンコーダーの定義
ネットワークのエンコーダーパートは、ReLU活性化関数を使用した畳み込み層と最大プーリング層を使用します。目標は、ネットワークに送る前に入力データを冷却することです。このステップからの望ましい出力は、元のデータの圧縮バージョンです。MNIST画像は28x28x1の画像であることを考慮して、特定の形状の入力を作成します。
inps = Input(shape=(28, 28, 1))
x = Conv2D(32, (3, 3), activation="relu", padding="same")(inps)
x = MaxPooling2D((2, 2), padding="same")(x)
x = Conv2D(32, (3, 3), activation="relu", padding="same")(x)
x = MaxPooling2D((2, 2), padding="same")(x)
ボトルネックの定義
他の要素とは異なり、ボトルネックは明示的なプログラミングを必要としません。MaxPoolingエンコーダーレイヤーは非常に圧縮された最終出力を生成するため、デコーダーはこの圧縮された表現を利用して画像を再構築するために訓練されます。ボトルネックのアーキテクチャはより複雑なオートエンコーダーの実装で変更することができます。
デコーダーの定義
デコーダーは、ストライドが2の逆畳み込みを使用して構成されています。モデルの最後の層では、シグモイド活性化関数を使用した単純な2D畳み込みが使用されます。このコンポーネントの目的は、圧縮された表現から画像を再構築することです。逆畳み込みはアップサンプリングに使用され、より大きなストライドを可能にし、画像をアップサンプリングするために必要なステップ数を減らすことができます。
x = Conv2DTranspose(32, (3, 3),activation="relu", padding="same", strides=2)(x)
x = Conv2DTranspose(32, (3, 3),activation="relu", padding="same", strides=2)(x)
x = Conv2D(1, (3, 3), activation="sigmoid", padding="same")(x)
モデルの訓練
モデルを定義した後、オプティマイザーと損失関数で構成する必要があります。この記事では、Adamオプティマイザーを使用し、訓練にはバイナリクロスエントロピー損失関数を選択します。
conv_autoenc_model = Model(inps, x)
conv_autoenc_model.compile(optimizer="adam", loss="binary_crossentropy")
conv_autoenc_model.summary()
出力
モデルが構築されたら、先に記事で作成した修正されたMNIST画像を使用してモデルをトレーニングすることができます。トレーニングプロセスでは、バッチサイズ128で50エポックのモデルを実行します。さらに、モデルに検証データを提供します。
conv_autoenc_model.fit(
x=ds_train,
y=ds_train,
epochs=50,
batch_size=128,
shuffle=True,
validation_data=(ds_test, ds_test),
)
画像の再構築
モデルをトレーニングした後、予測を生成し画像を再構築することができます。以前に定義した関数を使用して生成された画像を表示することができます。
preds = conv_autoenc_model.predict(ds_test)
display(ds_test, preds)
結論
オートエンコーダは、教師なしデータエンコーディングを学習するために使用できる人工ニューラルネットワークです。主な目標は、次元を削減するために、高次元データに対して低次元表現(エンコーディング)を得ることです。グリッドは、入力画像の最も重要な特徴や特性を捉えるための効率的なデータ表現と分析を実現します。
重要なポイント
- オートエンコーダは、ニューラルネットワークで使用される教師なし学習技術です。ネットワークをトレーニングして、不要な信号ノイズをフィルタリングすることで、効率的なデータ表現(エンコーディング)を学習するように設計されています。
- オートエンコーダには、イメージング、イメージ圧縮、場合によってはイメージ生成など、さまざまな応用があります。
- オートエンコーダは、理論的な基盤がシンプルであるため、一見すると簡単に思われますが、入力データの意味のある表現を学習させることは難しい場合があります。
- オートエンコーダには、主成分分析(PCA)などの次元削減技術、イメージレンダリング、その他多くのタスクなど、さまざまな応用があります。
よくある質問
この記事に表示されているメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles