//20201109
> 写在前面:今天实现了一个自动解码器,后面有一个除噪的应用,在这里做个summary
> 核心思想:设置对等网络(入口和出口size一样),然后训练对等图片
#### 零、导包
- 代码如下:
import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt
#### 一、数据准备
- 此处使用keras mnist数据集,或许训练量不是很大,但是主要理解逻辑
- 代码如下:
- 获取数据:
(x_train,_),(x_test,_) = keras.datasets.mnist.load_data() x_train = x_train.astype('float32')/255. x_test = x_test.astype('float32')/255. x_train = np.reshape(x_train,(-1,28,28,1)) x_test = np.reshape(x_test,(-1,28,28,1))
- 给初始数据加上噪音(noisy):
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_train_noisy = np.clip(x_train_noisy,0.,1.) x_test_noisy = np.clip(x_test_noisy,0.,1.)
#### 二、展示加上噪音之后的图片
n = 10 plt.figure(figsize = (20,2)) for i in range(n): ax = plt.subplot(1,n,i+1) plt.imshow(x_test_noisy[i].reshape(28,28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show()
#### 三、构建网络模型
- 此处使用一个卷积层作为输入,多个卷积层、池化层、上采样层来进行训练,最后使用一个卷积层作为输出(注意:最后一个卷积层只有一个卷积核,因为输出的是图像,mnist中图像只有一个轨道)
img_input = keras.layers.Input(shape=(28,28,1)) x = keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(img_input) x = keras.layers.MaxPool2D((2,2),padding='same')(x) x = keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(x) encoder = keras.layers.MaxPool2D((2,2),padding = 'same')(x) x = keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(encoder) x = keras.layers.UpSampling2D((2,2))(x) x = keras.layers.Conv2D(32,(3,3),activation = 'relu',padding='same')(x) x = keras.layers.UpSampling2D((2,2))(x) decoder = keras.layers.Conv2D(1,(3,3),activation='sigmoid',padding = 'same')(x) autoencoder_2 = keras.models.Model(inputs = img_input,outputs = decoder)
#### 四、开始训练(这里使用adam优化器,二元交叉熵函数作为损失函数)
autoencoder_2.compile(optimizer='adam',loss = 'binary_crossentropy') # print(autoencoder_2.summary()) print(x_train_noisy.shape) print(x_train.shape) autoencoder_2.fit( x_train_noisy, x_train, epochs = 100, batch_size = 128, shuffle = True, validation_data = (x_test_noisy,x_test) )
#### 五、使用训练好的网络模型进行预测
predict_pic_denoisy = autoencoder_2.predict(x_test_noisy)
#### 六、展示输入输出图像
n = 10 # 我們想展示圖像的數量 plt.figure(figsize=(20, 4)) for i in range(n): # 秀出原圖像 ax = plt.subplot(2, n, i + 1) plt.imshow(x_test_noisy[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(predict_pic_denoisy[i].reshape(28, 28)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) plt.show()
图像实例如下:
以上
希望对大家有所帮助