keras自動編碼器實現系列之卷積自動編碼器

2021-08-03 08:36:54 字數 3736 閱讀 3419

的自動編碼很容易就想到用卷積神經網路做為編碼-解碼器。在實際的操作中, 

也經常使用卷積自動編碼器去解決影象編碼問題,而且非常有效。

下面通過**keras**完成簡單的卷積自動編碼。 編碼器有堆疊的卷積層和池化層

(max pooling用於空間降取樣)組成。 對應的解碼器由卷積層和上取樣層組成。

@requires_authorization

# -*- coding:utf-8 -*-

from keras.layers import input, dense, conv2d, maxpooling2d, upsampling2d

from keras.models import model

from keras import backend as k

import os

## 網路結構 ##

input_img = input(shape=(28,28,1)) # tensorflow後端, 注意要用channel_last

# 編碼器部分

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')(x)

# 解碼器部分

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', padding='same')(x)

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

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

autoencoder = model(input_img, decoded)

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

# 得到編碼層的輸出

encoder_model = model(inputs=autoencoder.input, outputs=autoencoder.get_layer('encoder_out').output)

## 匯入資料, 使用常用的手寫識別資料集

defload_mnist

(dataset_name):

'''load the data

''' data_dir = os.path.join("./data", dataset_name)

f = np.load(os.path.join(data_dir, 'mnist.npz'))

train_data = f['train'].t

trx = train_data.reshape((-1, 28, 28, 1)).astype(np.float32)

try = f['train_labels'][-1].astype(np.float32)

test_data = f['test'].t

tex = test_data.reshape((-1, 28, 28, 1)).astype(np.float32)

tey = f['test_labels'][-1].astype(np.float32)

# one-hot

# y_vec = np.zeros((len(y), 10), dtype=np.float32)

# for i, label in enumerate(y):

# y_vec[i, y[i]] = 1

# keras.utils裡帶的有one-hot的函式, 就直接用那個了

return trx / 255., try, tex/255., tey

# 開始匯入資料

x_train, _ , x_test, _= load_mnist('mnist')

# 視覺化訓練結果, 我們開啟終端, 使用tensorboard

# tensorboard --logdir=/tmp/autoencoder # 注意這裡是開啟乙個終端, 在終端裡執行

# 訓練模型, 並且在callbacks中使用tensorboard例項, 寫入訓練日誌

from keras.callbacks import tensorboard

autoencoder.fit(x_train, x_train,

epochs=50,

batch_size=128,

shuffle=true,

validation_data=(x_test, x_test),

callbacks=[tensorboard(log_dir='/tmp/autoencoder')])

# 重建

import matplotlib.pyplot as plt

decoded_imgs = autoencoder.predict(x_test)

encoded_imgs = encoder_model.predict(x_test)

n = 10

plt.figure(figsize=(20, 4))

for i in range(n):

k = i + 1

# 畫原始

ax = plt.subplot(2, n, k)

plt.imshow(x_test[k].reshape(28, 28))

plt.gray()

ax.get_xaxis().set_visible(false)

# 畫重建

ax = plt.subplot(2, n, k + n)

plt.imshow(decoded_imgs[i].reshape(28, 28))

plt.gray()

ax.get_xaxis().set_visible(false)

ax.get_yaxis().set_visible(false)

plt.show()

# 編碼得到的特徵

n = 10

plt.figure(figsize=(20, 8))

for i in range(n):

k = i + 1

ax = plt.subplot(1, n, k)

plt.imshow(encoded[k].reshape(4, 4 * 8).t)

plt.gray()

ax.get_xaxis().set_visible(false)

ax.get_yaxis().set_visible(false)

plt.show()

自動編碼器

自動編碼器基本概念 自動編碼器 autoencoder 是神經網路的一種,一般來講自動編碼器包括兩部分 編碼器和解碼器,編碼器和解碼器相互串聯合作,實現資料的降維或特徵學習,現在也廣泛用於生成模型中.在深度學習中,autoencoder可用於在訓練階段開始前,確定權重矩陣的初始值.左側為encode...

自動編碼器(Autoencoder)

autoencoder是一種無監督的學習演算法,主要用於資料的降維或者特徵的抽取,在深度學習中,autoencoder可用於在訓練階段開始前,確定權重矩陣 w 的初始值。神經網路中的權重矩陣 w可看作是對輸入的資料進行特徵轉換,即先將資料編碼為另一種形式,然後在此基礎上進行一系列學習。然而,在對權重...

自動編碼器(Autoencoder)

autoencoder是一種無監督的學習演算法,主要用於資料的降維或者特徵的抽取,在深度學習中,autoencoder可用於在訓練階段開始前,確定權重矩陣w的初始值。或參考 自動編碼器 autoencoder 對於多層神經網路的引數初始化問題,我們可以依次對每一層進行autoencoder。如下圖所...