MLAT-Autoencoders---下篇-关键代码及结果展示(1)
生活随笔
收集整理的這篇文章主要介紹了
MLAT-Autoencoders---下篇-关键代码及结果展示(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
自編碼器的實現(python)
本節主要展示了應用深度前饋、稀疏約束神經網絡構建自編碼器。另外卷積自編碼器對圖像進行去噪這一應用也非常實用,將在單獨放在下篇展示。
1.導入各類包
from pathlib import Pathimport numpy as np from numpy.random import choice from numpy.linalg import norm import pandas as pdimport tensorflow as tf from tensorflow.keras.layers import Input, Dense from tensorflow.keras import regularizers from tensorflow.keras.models import Model from tensorflow.keras.callbacks import TensorBoard, EarlyStopping, ModelCheckpoint from tensorflow.keras.datasets import fashion_mnistfrom sklearn.preprocessing import minmax_scale from sklearn.manifold import TSNEfrom scipy.spatial.distance import pdist, cdistimport seaborn as sns import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from matplotlib.offsetbox import AnnotationBbox, OffsetImage from mpl_toolkits.axes_grid1 import make_axes_locatable2.數據準備
這里同樣使用了書中的Fashion MNIST數據集。
#關鍵代碼展示 (X_train, y_train), (X_test, y_test) = fashion_mnist.load_data() X_train.shape, X_test.shape #訪問60000個訓練樣本和10000個測試灰度樣本,分辨率為28 x 28像素 image_size = 28 # 圖像大小 input_size = image_size ** 2 # 壓縮因子 = 784 / 32 = 24.5 class_dict = {0: 'T-shirt/top',1: 'Trouser',2: 'Pullover',3: 'Dress',4: 'Coat',5: 'Sandal',6: 'Shirt',7: 'Sneaker',8: 'Bag',9: 'Ankle boot'} classes = list(class_dict.keys())3.生成圖像
fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(14, 5)) axes =axes.flatten() for row, label in enumerate(classes):label_idx = np.argwhere(y_train == label).squeeze()axes[row].imshow(X_train[choice(label_idx)], cmap='gray')axes[row].axis('off')axes[row].set_title(class_dict[row])fig.suptitle('Fashion MNIST Samples', fontsize=14) fig.tight_layout() fig.subplots_adjust(top=.85)out:
4.規范Fashion MNIST數據
重塑數據,使每一幅圖像都用一個平坦的一維像素向量表示,這個像素向量有28 x 28 = 784個元素,在[0,1]之間。
encoding_size = 32 # 編碼的size def data_prep(x, size=input_size):return x.reshape(-1, size).astype('float32')/255 X_train_scaled = data_prep(X_train) X_test_scaled = data_prep(X_test) X_train_scaled.shape, X_test_scaled.shapeout:
5.深度前饋自編碼器
先從帶有單一隱藏層的普通前饋自動編碼器開始。
將28 × 28個圖像編碼為32個值表示,壓縮系數為24.5。
out:
編碼建模
下表可見編碼器只使用大約一半的總參數,因此可以使用編碼器來壓縮數據。
encoder = Model(inputs=input_ ,outputs=encoding,name='Encoder') encoder.summary()解碼建模
解碼器由最后一個自編碼器層組成,由編碼數據的占位符提供。
#編碼輸入的占位符: encoded_input = Input(shape=(encoding_size,),name='Decoder_Input') #提取最后一個自編碼器層: decoder_layer = autoencoder.layers[-1](encoded_input) #解碼模型: decoder = Model(inputs=encoded_input,outputs=decoder_layer) decoder.summary()out:
訓練自編碼器
autoencoder.compile(optimizer='adam', loss='mse') #訓練autoencoder: #最小化輸入數據和自編碼器間的MSE,這里要使用相同的輸入和輸出數據訓練模型: #創建early_stopping回調: early_stopping = EarlyStopping(monitor='val_loss', min_delta=1e-5, patience=5, verbose=0,restore_best_weights=True,mode='auto')#創建TensorBard回調來可視化網絡性能: tb_callback = TensorBoard(log_dir=results_path / 'logs',histogram_freq=5,write_graph=True,write_images=True)#創建checkpoint回調: filepath = (results_path / 'autencoder.32.weights.hdf5').as_posix() checkpointer = ModelCheckpoint(filepath=filepath, monitor='val_loss', save_best_only=True,save_weights_only=True,mode='auto') #擬合模型 training = autoencoder.fit(x=X_train_scaled,y=X_train_scaled,epochs=100,batch_size=32,shuffle=True,validation_split=.1,callbacks=[tb_callback, early_stopping, checkpointer])out:
從性能最好的模型中reload權重
autoencoder.load_weights(filepath) mse = autoencoder.evaluate(x=X_test_scaled, y=X_test_scaled) f'MSE: {mse:.4f} | RMSE {mse**.5:.4f}'#訓練在大約20個epoch后停止,測試均方根誤差為0.1122 encoded_test_img = encoder.predict(X_test_scaled) encoded_test_img.shape decoded_test_img = decoder.predict(encoded_test_img) decoded_test_img.shape接下來將原始樣本與重建樣本進行比較:
out出的為10幅原始圖像及其自編碼器的重構,且表明了壓縮后的損失。
out:
6.稀疏約束自編碼器
基本流程同5.,結果:輸入層和解碼層保持不變,壓縮因子24.5,正則化會對性能產生負面影響,測試均方根為0.0.1229。
encoding_l1 = Dense(units=encoding_size,activation='relu',activity_regularizer=regularizers.l1(10e-5),name='Encoder_L1')(input_) decoding_l1 = Dense(units=input_size,activation='sigmoid',name='Decoder_L1')(encoding_l1) autoencoder_l1 = Model(input_, decoding_l1) autoencoder_l1.compile(optimizer='adam', loss='mse')encoder_l1 = Model(inputs=input_, outputs=encoding_l1, name='Encoder') In [45]: encoded_input = Input(shape=(encoding_size,), name='Decoder_Input') encoded_input = Input(shape=(encoding_size,), name='Decoder_Input') decoder_l1_layer = autoencoder_l1.layers[-1](encoded_input) decoder_l1 = Model(inputs=encoded_input, outputs=decoder_l1_layer) path = (results_path / 'autencoder_l1.32.weights.hdf5').as_posix() autoencoder_l1, mse = train_autoencoder(path, autoencoder_l1) f'MSE: {mse:.4f} | RMSE {mse**.5:.4f}' encoded_test_img = encoder_l1.predict(X_test_scaled) fig, axes = plt.subplots(ncols=n_classes, nrows=2, figsize=(20, 4)) for i in range(n_classes):axes[0, i].imshow(X_test_scaled[i].reshape(image_size,image_size),cmap='gray')axes[0, i].axis('off')axes[1, i].imshow(decoded_test_img[i].reshape(28, 28),cmap='gray')axes[1, i].axis('off')out:
總結
以上是生活随笔為你收集整理的MLAT-Autoencoders---下篇-关键代码及结果展示(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac版Ps、AE、PR不能突然使用?
- 下一篇: 关于今天参加学校ACM比赛的感想