keras瞎搞系列-卷积自编码去噪
我们把训练样本用噪声污染,然后使解码器解码出干净的照片,以获得去噪自动编码器。首先我们把原图片加入高斯噪声,然后把像素值clip到0~1。
头文件
from keras.layers import Input,Convolution2D
from keras.models import Model
from keras.datasets import mnist
from keras.callbacks import EarlyStopping
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.
将值归一化到0-1
调整大小
这里所需要的是[28,28,1]维的,所以得调整大小。
X_train = np.reshape(X_train,(len(X_train),28,28,1))
X_test = np.reshape(X_test,(len(X_test),28,28,1))
添加噪声
noise_factor = 0.5
X_train_noisy = X_train+noise_factor*np.random.normal(loc=0.0,scale=1.0,size=X_train.shape)
X_test_noisy = X_test+noise_factor*np.random.normal(loc=0.0,scale=1.0,size=X_test.shape)
X_test_noisy = np.clip(X_test_noisy,0.,1.)
X_train_noisy = np.clip(X_train_noisy,0.,1.)
构建模型
input_img = Input(shape=(28,28,1))
x = Convolution2D(32,(3,3),activation='relu',padding='same')(input_img)
x = MaxPooling2D((2,2),padding='same')(x)
x = Convolution2D(32,(3,3),activation='relu',padding='same')(x)
encoded = MaxPooling2D((2,2),padding='same')(x)
x = Convolution2D(32,(3,3),activation='relu',padding='same')(encoded)
x = UpSampling2D((2,2))(x)
x = Convolution2D(32,(3,3),activation='relu',padding='same')(x)
x = UpSampling2D((2,2))(x)
decoded = Convolution2D(1,(3,3),activation='sigmoid',padding='same')(x)
autoencoder = Model(inputs=input_img,outputs = decoded)
模型编译和训练
autoencoder.compile(optimizer='adadelta',loss='binary_crossentropy')
autoencoder.fit(X_train_noisy,X_train,epochs=50,batch_size=256,shuffle=True,validation_data=(X_test_noisy,X_test))m
模型预测
decoded_imgs = autoencoder.predict(X_test_noisy)