實現 AutoEncoder 模型

2021-09-19 22:00:02 字數 4695 閱讀 9196

最近在 kaggle 上學習些 keras 的使用方法,這裡總結下 autoencoder 使用方式

對於autoencoder模型定義有兩種方式:

from operator import mul   

from functools import reduce

def product(dset):

return reduce(mul, dset)

def encoder_model(x_shape, y_shape):

"""定義 encoder 部分模型,這裡將最後一層的資料維度記錄下來,作為 decoder 輸入層後的接下來的一層大小

"""inp = input(shape=x_shape)

m = conv2d(16, (3, 3), activation='relu', padding='same')(inp)

m = maxpooling2d((2, 2), padding='same')(m)

m = conv2d(8, (3, 3), activation='relu', padding='same')(m)

m = maxpooling2d((2, 2), padding='same')(m)

m = conv2d(8, (3, 3), activation='relu', padding='same')(m)

shape = m.shape

m = flatten()(m)

outp = dense(y_shape)(m)

return inp, outp, shape[1:]

def decoder_model(x_shape, x_shape_2d):

"""定義 decoder 部分模型

"""inp = input(shape=x_shape)

m = dense(product(x_shape_2d))(inp)

# 資料維度的轉換 1d 轉為 2d

m = reshape(x_shape_2d)(m)

m = conv2d(8, (3, 3), activation='relu', padding='same')(m)

m = upsampling2d((2, 2))(m)

m = conv2d(8, (3, 3), activation='relu', padding='same')(m)

m = upsampling2d((2, 2))(m)

outp = conv2d(1, (3, 3), activation='sigmoid', padding='same')(m)

return inp, outp

# 定義 encoder 模型

encoder_inp, encoder_outp, shape = encoder_model((28, 28, 1), 100)

encoder = model(inputs=encoder_inp, outputs=encoder_outp)

encoder.summary()

print(shape)

# 定義 decoder 模型

decoder_inp, decoder_outp = decoder_model(encoder_outp.shape[1:], shape)

decoder = model(inputs=decoder_inp, outputs=decoder_outp)

decoder.summary()

# 定義 autoencoder 模型

autoencoder = model(inputs=encoder_inp, outputs=decoder(encoder(encoder_inp)), name='autoencoder')

autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

autoencoder.summary()

noise = np.random.normal(loc=0.5, scale=0.5, size=x_train.shape)

x_train_noisy = x_train + noise

noise = np.random.normal(loc=0.5, scale=0.5, size=x_cv.shape)

x_cv_noisy = x_cv + noise

autoencoder.fit(x_train_noisy, x_train, validation_data=(x_cv_noisy, x_cv),

epochs=100, batch_size=128)

input_img = input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format

x = conv2d(16, (3, 3), activation='relu', padding='same')(input_img)

x = maxpooling2d((2, 2), padding='same')(x)

x = conv2d(8, (3, 3), activation='relu', padding='same')(x)

x = maxpooling2d((2, 2), padding='same')(x)

x = conv2d(8, (3, 3), activation='relu', padding='same')(x)

encoded = maxpooling2d((2, 2), padding='same', name='encoder')(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional

x = conv2d(8, (3, 3), activation='relu', padding='same')(encoded)

x = upsampling2d((2, 2))(x)

x = conv2d(8, (3, 3), activation='relu', padding='same')(x)

x = upsampling2d((2, 2))(x)

x = conv2d(16, (3, 3), activation='relu')(x)

x = upsampling2d((2, 2))(x)

decoded = conv2d(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = model(input_img, decoded)

autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

autoencoder.summary()

autoencoder.fit(x_train, x_train, batch_size=64, epochs=100, verbose=1, validation_data=(x_cv, x_cv))

encoder = model(inputs=autoencoder.input,

outputs=autoencoder.get_layer('encoder').output)

這樣通過 autoencoder 模型的訓練來訓練 encoder 模型

x_encoded = encoder.predict(x_cv_noisy)

print(x_encoded[:1])

loss 高居不下

可以通過如下幾個方面進行改善:

x_train = normalize(x_train).reshape(-1, 28, 28, 1).astype(float32) / 255

# 在 decoder 輸出的內容需要展示為時候,簡單的乘以 255 即可

x_decoded = autoencoder.predict(x_cv_noisy)

imgs = np.concatenate([x_test[:num], x_cv_noisy[:num], x_decoded[:num]])

imgs = imgs.reshape((rows * 3, cols, image_size, image_size))

imgs = np.vstack(np.split(imgs, rows, axis=1))

imgs = imgs.reshape((rows * 3, -1, image_size, image_size))

imgs = np.vstack([np.hstack(i) for i in imgs])

# 將資料進行還原即可

imgs = (imgs * 255).astype(np.uint8)

sgd = sgd(lr=1e-4, decay=1e-6, momentum=0.4, nesterov=true)
m = conv2d(16, 3, activation=leakyrelu(alpha=0.2), padding='same', kernel_initializer='glorot_normal')(m)
·「參考」

why my training and validation loss is not changing?

building autoencoders in keras

Keras上實現AutoEncoder自編碼器

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

AutoEncoder學習記錄

autoencoder 屬於神經網路範疇,autoencoder 重點關注的是 hidden layer,而它通常只有一層 hidden layer。autoencoder包含encoder與decoder兩部分 通過encoder將輸入x對映到特徵空間z,再通過decoder將抽象表示z對映回原始...

初步了解autoencoder

學習自莫煩python 自編碼 autoencoder 是一種神經網路的形式。例子 一張 對其進行打碼 最後再將其還原 壓縮的時候,的質量會縮減,解壓還原的時候用資訊量小卻包含了關鍵資訊的檔案來還原出原來的。神經網路接受大量資訊進而學習是一件吃力的事情,所以為了讓神經網路的負擔沒有那麼重,所以要從原...