Keras上實現AutoEncoder自編碼器

2021-07-29 21:02:55 字數 2741 閱讀 9076

無監督特徵學習(unsupervised feature learning)是一種仿人腦的對特徵逐層抽象提取的過程,學習過程中有兩點:一是無監督學習,即對訓練資料不需要進行標籤化標註,這種學習是對資料內容的組織形式的學習,提取的是頻繁出現的特徵;二是逐層抽象,特徵是需要不斷抽象的。

自編碼器(autoencoder),即可以使用自身的高階特徵自我編碼,自編碼器其實也是一種神經網路,其輸入和輸出是一致的,借助了稀疏編碼的思想,目標是使用稀疏的高階特徵重新組合來重構自己。

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. - 0.5 # minmax_normalized

x_test = x_test.astype('float32') / 255. - 0.5 # 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')

# training

autoencoder.fit(x_train, x_train, epochs=20, 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()

自編碼,簡單來說就是把輸入資料進行乙個壓縮和解壓縮的過程。原來有很多特徵,壓縮成幾個來代表原來的資料,解壓之後恢復成原來的維度,再和原資料進行比較。它是一種非監督演算法,只需要輸入資料,解壓縮之後的結果與原資料本身進行比較。程式的主要功能是把 datasets.mnist 資料的 28*28=784 維的資料,壓縮成 2 維的資料,然後在乙個二維空間中視覺化出分類的效果。

首先,匯入資料並進行資料預處理,本例使用model模組的keras的泛化模型來進行模型搭建,便於我們從模型中間匯出資料並進行視覺化。進行模型搭建的時候,注意要進行逐層特徵提取,最終壓縮至2維,解碼的過程要跟編碼過程一致相反。隨後對autoencoder和encoder分別建模,編譯、訓練。將編碼模型的**結果通過matplotlib視覺化出來,就可以看到原資料的二維編碼結果在二維平面上的聚類效果,還是很明顯的。

最後看到視覺化的結果,自編碼模型可以把這幾個數字給區分開來,我們可以用自編碼這個過程來作為乙個特徵壓縮的方法,和pca的功能一樣,效果要比它好一些,因為它是非線性的結構。

keras 上新增 roc auc指標

keras 輸出roc指標,不能每個batch輸出一次,需要全部計算完再一次計算一次。使用sklearn中的metrics roc來計算。幾個帖子類似 class roc callback keras.callbacks.callback def init self,training data,va...

keras實現分組卷積

分組卷積在pytorch中比較容易實現,只需要在卷積的時候設定group引數即可 比如設定分組數為2 conv group nn.conv2d c in,c out,kernel size 3,stride 3,padding 1,groups 2 但是,tensorflow中目前還沒有分組卷積,只...

Keras 2 3 keras實現卷積神經網路

cnn convolutional neural networks 卷積神經網路在 keras 上的 實現。用到的資料集還是mnist。不同的是這次用到的層比較多,匯入的模組也相應增加了一些。下面直接進入 部分 import numpy as np np.random.seed 1337 for r...