Kerasはエンコーダから構築して操作します。


プロフィール:
従来のマシン学習のタスクは、良い特徴工学に大きく依存していますが、特徴的なプロジェクトは、映像、音声、ビデオから効果的な特徴を抽出するのは難しいです。エンジニアはこれらの分野で非常に深い理解が必要で、専門的なアルゴリズムを使ってこれらのデータの特徴を抽出する必要があります。深さ学習は人工的に有効な特徴を抽出しにくい問題を解決でき、機械学習モデルの特徴工学への依存性を大幅に緩和する。
深さ学習は初期に一度は無監督の特徴学習過程と考えられ、人間の脳を模倣して特徴を逐次抽象化する過程である。この中の二点は重要です。一つは無監督学習です。二は逐層訓練である。例えば、画像認識問題において、多くの自動車画像があると仮定して、どのようにコンピュータを利用して識別タスクを行うべきですか?ピクセルレベルからクラス分け器を訓練すると、ほとんどのアルゴリズムが動作しにくいです。高次の特徴を抽出すれば、例えば自動車の車輪、自動車の車窓、車体などです。これらの高次特性を用いて画像を非常に正確に分類できる。しかし高次の特徴はすべて底部の特徴から構成されており、これは深さ学習訓練中に行われた特徴的な学習である。
以前、少数の基本的な特徴を使って組み合わせて、より高層の抽象的な特徴を得ることができると学者が発見しました。画像タスクに対しては、一枚のオリジナル画像をより少ない画像の破片で組み合わせて得ることができる。音声認識タスクにとっては、ほとんどの音もいくつかの基本的な構造の線形結合によって得られる。顔認識のタスクには、鼻、口、眉、目などの臓器によって、さまざまな形の人の顔を上に向けて戦うことができます。深度神経ネットワークにおいては、各階層の神経ネットワークに対して、前の層の出力は未加工の画素であり、この層は画素をより高次的な特徴に加工して組織するプロセスである(すなわち、前述のピクチャの断片を線形結合加工するプロセスである)。
上記の基本概念の説明によると、特徴は常に抽象的に高い特徴に転じることができます。これらの基本構造をどのように探して、どのように抽象化しますか?ここでは、非監視の自動エンコーダを引き出して、特徴を抽出する。エンコーダー→名前の通り、自分の高次の特徴を使って自分を符号化することができます。その入力と出力は一致しています。従って,その基本的な考えは,疎ないくつかの高次特性を用いて再結合して自己を再構成することである。エンコーダーからの最初の提案は、ハイントンがScience上で文章を発表し、データの劣化問題を解決するために用いられる。また、Huntonは、深い信念ネットワークに基づく無監督層毎の訓練に対する貪欲アルゴリズムを提案し、深いネットワークを訓練するために実行可能な方法を提供した。深さ信念ネットワークの提案は、階層毎のトレーニングを使用して特徴を抽出し、学習タスクを監視する前に、ネットワーク重みをより良い位置に初期化させる。その思想はエンコーダから非常に似ている。この基礎の上で、国内外の学者はまたエンコーダからの各種のバージョンを出して、例えば:まばらにエンコーダから来て、エンコーダからノイズを除去します。
本論文ではKeras深さ学習開発ライブラリを用いて、MNISTデータセットに簡単なセルフエンコーダ、深さ疎自エンコーダ、及び畳み込み自エンコーダを実現した。
エンコーダからの用途:
現在の自己符号化器の応用は主に二つの面があり、第一はデータノイズ除去であり、第二は可視化のための劣化である。適切な次元と疎制約を組み合わせて,PCAなどの技術よりも興味深いデータ投影をエンコーダから学ぶことができる。また、データ共有の特徴モデル化においても、幅広い応用がある。
1、エンコーダから簡単に
簡単なセルフエンコーダ

from keras.layers import Input, Dense
from keras.models import Model
from keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt
 
(x_train, _), (x_test, _) = mnist.load_data()
 
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
print(x_train.shape)
print(x_test.shape)
 
encoding_dim = 32
input_img = Input(shape=(784,))
 
encoded = Dense(encoding_dim, activation='relu')(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)
 
autoencoder = Model(inputs=input_img, outputs=decoded)
encoder = Model(inputs=input_img, outputs=encoded)
 
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
 
decoder = Model(inputs=encoded_input, outputs=decoder_layer(encoded_input))
 
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
 
autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, 
  shuffle=True, validation_data=(x_test, x_test))
 
encoded_imgs = encoder.predict(x_test)
decoded_imgs = decoder.predict(encoded_imgs)
 
n = 10 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
 ax = plt.subplot(2, n, i + 1)
 plt.imshow(x_test[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 ax = plt.subplot(2, n, i + 1 + n)
 plt.imshow(decoded_imgs[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show()
テストの効果:

2、深さはエンコーダから、エンコーダからまばらになります。
自己コード再構築の損失が大きい問題を解決するために、多重層ネットワークを使ってエンコーダから構築する。隠蔽ユニットに疎性の制約を加えると、よりコンパクトな表現が得られ、一部のニューロンだけが活性化されます。Kerasでは、activityを追加できます。reglarizerは、あるレイヤーの活性化値を制約する目的を達成します。

import numpy as np 
np.random.seed(1337) # for reproducibility 
 
from keras.datasets import mnist 
from keras.models import Model #     
from keras.layers import Dense, Input 
import matplotlib.pyplot as plt 
 
# X shape (60,000 28x28), y shape (10,000, ) 
(x_train, _), (x_test, y_test) = mnist.load_data() 
 
#       
x_train = x_train.astype('float32') / 255. # minmax_normalized 
x_test = x_test.astype('float32') / 255. # minmax_normalized 
x_train = x_train.reshape((x_train.shape[0], -1)) 
x_test = x_test.reshape((x_test.shape[0], -1)) 
print(x_train.shape) 
print(x_test.shape) 
 
#        2  
encoding_dim = 2 
 
# this is our input placeholder 
input_img = Input(shape=(784,)) 
 
#     
encoded = Dense(128, activation='relu')(input_img) 
encoded = Dense(64, activation='relu')(encoded) 
encoded = Dense(10, activation='relu')(encoded) 
encoder_output = Dense(encoding_dim)(encoded) 
 
#     
decoded = Dense(10, activation='relu')(encoder_output) 
decoded = Dense(64, activation='relu')(decoded) 
decoded = Dense(128, activation='relu')(decoded) 
decoded = Dense(784, activation='tanh')(decoded) 
 
#         
autoencoder = Model(inputs=input_img, outputs=decoded) 
 
#        
encoder = Model(inputs=input_img, outputs=encoder_output) 
 
# compile autoencoder 
autoencoder.compile(optimizer='adam', loss='mse') 
 
autoencoder.summary()
encoder.summary()
 
# training 
autoencoder.fit(x_train, x_train, epochs=10, batch_size=256, shuffle=True) 
 
# plotting 
encoded_imgs = encoder.predict(x_test) 
 
plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test,s=3) 
plt.colorbar() 
plt.show() 
 
decoded_imgs = autoencoder.predict(x_test)
# use Matplotlib (don't ask)
import matplotlib.pyplot as plt
 
n = 10 # how many digits we will display
plt.figure(figsize=(20, 4))
for i in range(n):
 # display original
 ax = plt.subplot(2, n, i + 1)
 plt.imshow(x_test[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 # display reconstruction
 ax = plt.subplot(2, n, i + 1 + n)
 plt.imshow(decoded_imgs[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show() 
実行結果:

3、エンコーダから畳み込む
エンコーダーから畳み込まれたエンコーダー部分は畳み込み層とMaxPooling層からなり、MaxPoolingは空域でのサンプリングを担当する。デコーダは、畳み込み層と上サンプリング層から構成される。

from keras.layers import Input, Dense, Convolution2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras.datasets import mnist
import numpy as np
 
(x_train, _), (x_test, _) = mnist.load_data()
 
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
print('---> x_train shape: ', x_train.shape)
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))
print('---> xtrain shape: ', x_train.shape)
print('---> x_test shape: ', x_test.shape)
input_img = Input(shape=(28, 28, 1))
 
x = Convolution2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Convolution2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Convolution2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
 
x = Convolution2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Convolution2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Convolution2D(1, (3, 3), activation='sigmoid', padding='same')(x)
 
autoencoder = Model(inputs=input_img, outputs=decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
 
#          TensorBoard,      tensorboard --logdir=/autoencoder
autoencoder.fit(x_train, x_train, epochs=10, batch_size=256,
  shuffle=True, validation_data=(x_test, x_test))
 
decoded_imgs = autoencoder.predict(x_test)
import matplotlib.pyplot as plt
decoded_imgs = autoencoder.predict(x_test)
 
n = 10
plt.figure(figsize=(20, 4))
for i in range(1, n+1):
 # display original
 ax = plt.subplot(2, n, i)
 plt.imshow(x_test[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 # display reconstruction
 ax = plt.subplot(2, n, i + n)
 plt.imshow(decoded_imgs[i].reshape(28, 28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show()
訓練結果の展示:

以上のこのKerasはエンコーダから操作します。つまり、小编は皆さんに全部の内容を共有しています。参考にしてほしいです。どうぞよろしくお愿いします。