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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

VAE(变分自编码器)学习笔记

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VAE(变分自编码器)学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VAE學習筆記

  • 普通的編碼器可以將圖像這類信息編碼成為特征向量.

  • 但通常這些特征向量不具有空間上的連續性.

  • VAE(變分自編碼器)可以將圖像信息編碼成為具有空間連續性的特征向量.

  • 方法是向編碼器和解碼器中加入統計信息,即特征向量代表的的是一個高斯分布,強迫特征向量服從高斯分布.

  • 編碼器是將圖片信息編碼成為一個高斯分布.

  • 解碼器則是從特征空間中進行采樣,再經過全連接層,反卷積層,卷積層等恢復成一張與輸入圖片大小相等的圖片.

  • 損失函數有兩個目標:即(1)擬合原始圖片以及(2)使得特征空間具有良好的結構及降低過擬合.因此,我們的損失函數由兩部分構成.其中第二部分需要使得編碼出的正態分布圍繞在標準正態分布周圍.


  • 實現代碼

    import keras from keras import layers from keras import backend as K from keras.models import Model import numpy as npimg_shape = (28,28,1) batch_size = 16 latent_dim = 2##### 圖片編碼器部分 input_img = keras.Input(shape = img_shape)x = layers.Conv2D(32,3,padding = 'same', activation = 'relu')(input_img) x = layers.Conv2D(64,3,padding = 'same', activation = 'relu',strides = (2,2))(x) x = layers.Conv2D(64,3,padding = 'same', activation = 'relu')(x) x = layers.Conv2D(64,3,padding = 'same', activation = 'relu')(x)shape_before_flatting = K.int_shape(x)x = layers.Flatten()(x) x = layers.Dense(32,activation='relu')(x)#輸入圖像最終被編碼為如下兩個參數 z_mean = layers.Dense(latent_dim)(x) z_log_var = layers.Dense(latent_dim)(x) # 需要注意的是 z_log_var = 2log(sigma) ##### 編碼器部分結束##### 采樣函數,用于在給定的正態分布中進行采樣,這也就是編碼器加入統計信息的地方. def sampling(args):z_mean, z_log_var = argsepsilon = K.random_normal(shape = (K.shape(z_mean)[0],latent_dim),mean = 0.,stddev = 1.)return z_mean + K.exp(0.5*z_log_var) * epsilon##### VAE解碼器部分 decoder_input = layers.Input(K.int_shape(z)[1:]) x = layers.Dense(np.prod(shape_before_flatting[1:]),activation='relu')(decoder_input) x = layers.Reshape(shape_before_flatting[1:])(x) x = layers.Conv2DTranspose(32,3,padding='same',activation = 'relu',strides = (2,2))(x) x = layers.Conv2D(1,3,padding='same',activation='sigmoid')(x) ##### 到這里x被恢復成為一張圖片##### 下面兩句話將編碼器和解碼器通過上采樣函數連接到了一起 decoder = Model(decoder_input,x) z = layers.Lambda(sampling)([z_mean,z_log_var]) z_decoder = decoder(z)###### 自定義損失函數層 def vae_loss(y_true,y_pred,e = 0.1):x = K.flatten(y_true)z_decoded = K.flatten(y_pred)xent_loss = keras.metrics.binary_crossentropy(x,z_decoded)kl_loss = -5e-4 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var),axis = -1)return K.mean(xent_loss + kl_loss)from keras.datasets import mnistvae = Model(input_img,z_decoder) vae.compile(optimizer = 'rmsprop',loss = vae_loss) vae.summary()##### 訓練模型 from keras.datasets import mnist (x_train,_),(x_test,y_test) = mnist.load_data() x_train = x_train.astype('float32') / 255. x_train = x_train.reshape(x_train.shape + (1,)) x_test = x_test.astype('float32') / 255. x_test = x_test.reshape(x_test.shape + (1,))vae.fit(x = x_train,y = x_train,shuffle = True,epochs = 10,batch_size = batch_size,validation_data = (x_test,x_test))##### 在特征空間進行連續采樣,觀察輸出圖片 import matplotlib.pyplot as plt from scipy.stats import norm n = 24 digit_size = 28 figure = np.zeros((digit_size*n,digit_size*n)) grid_x = norm.ppf(np.linspace(0.02,0.98,n)) grid_y = norm.ppf(np.linspace(0.02,0.98,n))print(batch_size)for i,yi in enumerate(grid_x):for j,xi in enumerate(grid_y):z_sample = np.array([[xi,yi]])z_sample = np.tile(z_sample,1).reshape(1, 2)x_decoded = decoder.predict(z_sample, batch_size = 1)digit = x_decoded[0].reshape(digit_size,digit_size)figure[i*digit_size:(i+1)*digit_size,j*digit_size:(j+1)*digit_size] = digitplt.figure(figsize = (15,15)) plt.imshow(figure,cmap = 'Greys_r') plt.show()

    輸出結果

    總結

    以上是生活随笔為你收集整理的VAE(变分自编码器)学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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