keras自動(dòng)編碼器實(shí)現(xiàn)系列之卷積自動(dòng)編碼器操作
圖片的自動(dòng)編碼很容易就想到用卷積神經(jīng)網(wǎng)絡(luò)做為編碼-解碼器。在實(shí)際的操作中,
也經(jīng)常使用卷積自動(dòng)編碼器去解決圖像編碼問(wèn)題,而且非常有效。
下面通過(guò)**keras**完成簡(jiǎn)單的卷積自動(dòng)編碼。 編碼器有堆疊的卷積層和池化層(max pooling用于空間降采樣)組成。 對(duì)應(yīng)的解碼器由卷積層和上采樣層組成。
@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
## 網(wǎng)絡(luò)結(jié)構(gòu) ##
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)
## 導(dǎo)入數(shù)據(jù), 使用常用的手寫識(shí)別數(shù)據(jù)集
def load_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的函數(shù), 就直接用那個(gè)了
return trX / 255., trY, teX/255., teY
# 開始導(dǎo)入數(shù)據(jù)
x_train, _ , x_test, _= load_mnist('mnist')
# 可視化訓(xùn)練結(jié)果, 我們打開終端, 使用tensorboard
# tensorboard --logdir=/tmp/autoencoder # 注意這里是打開一個(gè)終端, 在終端里運(yùn)行
# 訓(xùn)練模型, 并且在callbacks中使用tensorBoard實(shí)例, 寫入訓(xùn)練日志 http://0.0.0.0:6006
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()
補(bǔ)充知識(shí):keras搬磚系列-單層卷積自編碼器
考試成績(jī)出來(lái)了,竟然有一門出奇的差,只是有點(diǎn)意外。
覺(jué)得應(yīng)該不錯(cuò)的,竟然考差了,它估計(jì)寫了個(gè)隨機(jī)數(shù)吧。
頭文件
from keras.layers import Input,Dense from keras.models import Model from keras.datasets import mnist import numpy as np import matplotlib.pyplot as plt
導(dǎo)入數(shù)據(jù)
(X_train,_),(X_test,_) = mnist.load_data()
X_train = X_train.astype('float32')/255.
X_test = X_test.astype('float32')/255.
X_train = X_train.reshape((len(X_train),-1))
X_test = X_test.reshape((len(X_test),-1))
這里的X_train和X_test的維度分別為(60000L,784L),(10000L,784L)
這里進(jìn)行了歸一化,將所有的數(shù)值除上255.
設(shè)定編碼的維數(shù)與輸入數(shù)據(jù)的維數(shù)
encoding_dim = 32
input_img = Input(shape=(784,))
構(gòu)建模型
encoded = Dense(encoding_dim,activation='relu')(input_img) decoded = Dense(784,activation='relu')(encoded) autoencoder = Model(inputs = input_img,outputs=decoded) encoder = Model(inputs=input_img,outputs=encoded) encoded_input = Input(shape=(encoding_dim,)) decoder_layer = autoencoder.layers[-1] deconder = Model(inputs=encoded_input,outputs = decoder_layer(encoded_input))
模型編譯
autoencoder.compile(optimizer='adadelta',loss='binary_crossentropy')
模型訓(xùn)練
autoencoder.fit(X_train,X_train,epochs=50,batch_size=256,shuffle=True,validation_data=(X_test,X_test))
預(yù)測(cè)
encoded_imgs = encoder.predict(X_test)
decoded_imgs = deconder.predict(encoded_imgs)
數(shù)據(jù)可視化
n = 10 for i in range(n): ax = plt.subplot(2,n,i+1) plt.imshow(X_test[i].reshape(28,28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) ax = plt.subplot(2,n,i+1+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()
完成代碼
from keras.layers import Input,Dense
from keras.models import Model
from keras.datasets import mnist
import numpy as np
import matplotlib.pyplot as plt
(X_train,_),(X_test,_) = mnist.load_data()
X_train = X_train.astype('float32')/255.
X_test = X_test.astype('float32')/255.
X_train = X_train.reshape((len(X_train),-1))
X_test = X_test.reshape((len(X_test),-1))
encoding_dim = 32
input_img = Input(shape=(784,))
encoded = Dense(encoding_dim,activation='relu')(input_img)
decoded = Dense(784,activation='relu')(encoded)
autoencoder = Model(inputs = input_img,outputs=decoded)
encoder = Model(inputs=input_img,outputs=encoded)
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
deconder = Model(inputs=encoded_input,outputs = decoder_layer(encoded_input))
autoencoder.compile(optimizer='adadelta',loss='binary_crossentropy')
autoencoder.fit(X_train,X_train,epochs=50,batch_size=256,shuffle=True,validation_data=(X_test,X_test))
encoded_imgs = encoder.predict(X_test)
decoded_imgs = deconder.predict(encoded_imgs)
##via
n = 10
for i in range(n):
ax = plt.subplot(2,n,i+1)
plt.imshow(X_test[i].reshape(28,28))
plt.gray()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
ax = plt.subplot(2,n,i+1+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()
以上這篇keras自動(dòng)編碼器實(shí)現(xiàn)系列之卷積自動(dòng)編碼器操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 自動(dòng)監(jiān)控最新郵件并讀取的操作
這篇文章主要介紹了python 自動(dòng)監(jiān)控最新郵件并讀取的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
jupyter note 實(shí)現(xiàn)將數(shù)據(jù)保存為word
這篇文章主要介紹了jupyter note 實(shí)現(xiàn)將數(shù)據(jù)保存為word,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
python發(fā)送json參數(shù)的實(shí)例代碼
在寫腳本的過(guò)程中,除了發(fā)送form表單參數(shù)之外,我們還會(huì)發(fā)送json格式的參數(shù)。那么碰見json格式要怎么發(fā)送呢,這篇我們來(lái)解決這個(gè)問(wèn)題,需要的朋友可以參考下2019-10-10
Django使用詳解:ORM 的反向查找(related_name)
今天小編就為大家分享一篇Django使用詳解:ORM 的反向查找(related_name),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
基于Python編寫一個(gè)中秋節(jié)嫦娥投食小游戲
今天給大家?guī)?lái)的是給玉兔投喂月餅的小游戲。八月十五中秋夜晚,讓我們對(duì)著月亮許愿:希望我們?cè)谝夂驮谝馕覀兊娜耍T邪避退、百事無(wú)忌、平安喜樂(lè)、萬(wàn)事勝意。提前祝大家中秋節(jié)快樂(lè)2022-09-09
python爬蟲智能翻頁(yè)批量下載文件的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲智能翻頁(yè)批量下載文件的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02
Python實(shí)現(xiàn)釘釘發(fā)送報(bào)警消息的方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)釘釘發(fā)送報(bào)警消息的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
舉例講解Python的lambda語(yǔ)句聲明匿名函數(shù)的用法
匿名函數(shù)現(xiàn)在已經(jīng)成了各大編程語(yǔ)言爭(zhēng)相標(biāo)配的熱門特性,無(wú)需用函數(shù)名來(lái)定義函數(shù)的方式在很多場(chǎng)合下書寫起來(lái)十分炫酷,這里我們就來(lái)舉例講解Python的lambda語(yǔ)句聲明匿名函數(shù)的用法2016-07-07

