原文鏈接:http://www.one2know.cn/keras7/
Autoencoder 自編碼
- 壓縮與解壓
原來有時神經網絡要接受大量的輸入信息, 比如輸入信息是高清圖片時, 輸入信息量可能達到上千萬, 讓神經網絡直接從上千萬個信息源中學習是一件很吃力的工作. 所以, 何不壓縮一下, 提取出原圖片中的最具代表性的信息, 縮減輸入信息量, 再把縮減過后的信息放進神經網絡學習. 這樣學習起來就簡單輕松了. 所以, 自編碼就能在這時發揮作用. 通過將原數據白色的X 壓縮, 解壓 成黑色的X, 然后通過對比黑白 X ,求出預測誤差, 進行反向傳遞, 逐步提升自編碼的准確性. 訓練好的自編碼中間這一部分就是能總結原數據的精髓. 可以看出, 從頭到尾, 我們只用到了輸入數據 X, 並沒有用到 X 對應的數據標簽, 所以也可以說自編碼是一種非監督學習. 到了真正使用自編碼的時候. 通常只會用到自編碼前半部分 - Encoder 編碼器
編碼器能得到原數據的精髓, 然后我們只需要再創建一個小的神經網絡學習這個精髓的數據,不僅減少了神經網絡的負擔, 而且同樣能達到很好的效果
自編碼能從原數據中總結出每種類型數據的特征, 如果把這些特征類型都放在一張二維的圖片上, 每種類型都已經被很好的用原數據的精髓區分開來. 如果你了解 PCA 主成分分析, 再提取主要特征時, 自編碼和它一樣,甚至超越了 PCA. 換句話說, 自編碼 可以像 PCA 一樣 給特征屬性降維 - Decoder 解碼器
將精髓信息解壓成原始信息 - 實例
把 datasets.mnist 數據的 28×28=784 維的數據,壓縮成 2 維的數據,然后在一個二維空間中可視化出分類的效果
import numpy as np
np.random.seed(1)
from keras.datasets import mnist
from keras.models import Model
from keras.layers import Dense, Input
import matplotlib.pyplot as plt
# 獲取數據 非監督學習 不用y
(x_train, _), (x_test, y_test) = mnist.load_data()
# 預處理
x_train = x_train.astype('float32') / 255. - 0.5 # 標准化 -0.5~0.5
x_test = x_test.astype('float32') / 255. - 0.5
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)
# 要壓成的維度
encoding_dim = 2
# 原來的圖片數據大小
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(input=input_img, output=decoded)
# 激活模型
autoencoder.compile(optimizer='adam', loss='mse')
# 訓練 非監督學習 經歷壓縮和解壓的自己跟原來的自己比較
autoencoder.fit(x_train, x_train,epochs=20,batch_size=256,shuffle=True)
# 可視化結果
encoded_imgs = autoencoder.predict(x_test)
plt.scatter(encoded_imgs[:, 0], encoded_imgs[:, 1], c=y_test)
plt.colorbar()
plt.show()
輸出:
Epoch 1/20
256/60000 [..............................] - ETA: 1:41 - loss: 0.2318
1280/60000 [..............................] - ETA: 22s - loss: 0.2211
。。。
59648/60000 [============================>.] - ETA: 0s - loss: 0.0393
60000/60000 [==============================] - 2s 41us/step - loss: 0.0393
Save&reload 保存提取
- 保存模型
訓練完模型之后
from keras.models import save_model
model.save('my_model.h5)
- 導入模型
導入保存好的模型
from keras.models import load_model
model = load_model(my_model.h5)
還可以只保存權重,不保存模型結構
model.save_weights('my_model_weights.h5')
model.load_weights('my_model_weights.h5')
還可以用model.to_json 保存完結構之后,然后再去加載這個json_string,只保存結構,沒保存權重
from keras.models import model_from_json
json_string = model.to_json()
model = model_from_json(json_string)