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)