日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MLAT-Autoencoders---下篇-关键代码及结果展示(1)

發布時間:2023/12/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_locatable

2.數據準備

這里同樣使用了書中的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.shape

out:

5.深度前饋自編碼器

先從帶有單一隱藏層的普通前饋自動編碼器開始。
將28 × 28個圖像編碼為32個值表示,壓縮系數為24.5。

#輸入層: input_ = Input(shape=(input_size,), name='Input') #密集編碼層:模型的編碼器由一個完全連接的層組成,該層學習輸入的新的壓縮表示。這里有32個單位,壓縮比為24.5: encoding = Dense(units=encoding_size,activation='relu',name='Encoder')(input_) #密集解碼層: 解碼部分只需一步將壓縮后的數據重建為其原始大小: decoding = Dense(units=input_size,activation='sigmoid',name='Decoder')(encoding) #自編碼器建模: autoencoder = Model(inputs=input_,outputs=decoding,name='Autoencoder') autoencoder.summary()#下表可見自編碼器計算使用了50992這么多的參數。

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幅原始圖像及其自編碼器的重構,且表明了壓縮后的損失。

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')fig.suptitle('Original and Reconstructed Images', fontsize=20) fig.tight_layout() fig.subplots_adjust(top=.85) fig.savefig(results_path / 'reconstructed', dpi=300)

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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。