Auto-Encoder的NOTMNIST数据集去噪

 1、import libraries 

import tensorflow as tf
import tensorflow.keras

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, UpSampling2D, Conv2DTranspose
from tensorflow.keras.constraints import max_norm


import matplotlib.pyplot as plt
import numpy as np
import gzip

2、下载并查看数据集

! wget -O train-images.gz https://github.com/davidflanagan/notMNIST-to-MNIST/raw/master/train-images-idx3-ubyte.gz
! wget -O test-images.gz https://github.com/davidflanagan/notMNIST-to-MNIST/raw/master/train-images-idx3-ubyte.gz
! wget -O train-labels.gz https://github.com/davidflanagan/notMNIST-to-MNIST/raw/master/train-labels-idx1-ubyte.gz
! wget -O test-labels.gz https://github.com/davidflanagan/notMNIST-to-MNIST/raw/master/t10k-labels-idx1-ubyte.gz

# function for extracting images
def image_data(filename, num_images):
    with gzip.open(filename) as f:
        f.read(16)
        buf = f.read(28 * 28 * num_images)
        data = np.frombuffer(buf, dtype=np.uint8).astype(np.float32)
        data = data.reshape(num_images, 28,28)
        return data

# function for extracting labels
def image_labels(filename, num_images):
    with gzip.open(filename) as f:
        f.read(8)
        buf = f.read(1 * num_images)
        labels = np.frombuffer(buf, dtype=np.uint8).astype(np.int64)
        return labels

# import train and test data
train_data = image_data('train-images.gz', 60000)
test_data = image_data('test-images.gz', 10000)

# import train and test labels
train_labels = image_labels('train-labels.gz', 60000)
test_labels = image_labels('test-labels.gz', 10000)

img_width, img_height = 28, 28
input_shape = (img_width, img_height, 1)
batch_size = 120
no_epochs = 50
validation_splits = 0.2
max_norm_value = 2.0
noise_factor = 0.5

label_dict = {i: a for i,a in zip(range(10), 'ABCDEFGHIJ')}

digits = [[train_data[idx], train_labels[idx]] for idx in
                        np.random.randint(len(train_data), size=50)]

plt.figure(figsize=(15,10))
for i in range(50):
  plt.subplot(5, 10, i+1%10)

  plt.imshow(digits[i][0])
  plt.title(label_dict[digits[i][1]], fontsize=18)
  plt.xticks([])
  plt.yticks([])

plt.show()

输出:

3、创建噪声图像

train_data = train_data.reshape(-1, 28,28, 1)
test_data = test_data.reshape(-1, 28,28, 1)

train_data = train_data / np.max(train_data)
test_data = test_data / np.max(test_data)

noise_train = train_data + noise_factor * np.random.normal(0,1,train_data.shape)
noise_test = test_data + noise_factor * np.random.normal(0, 1, test_data.shape)

fig, ax = plt.subplots(1,10)
fig.set_size_inches(20, 4)
for i in range(10):
    curr_img = np.reshape(train_data[i], (28,28))
    curr_lbl = train_labels[i]
    ax[i].imshow(curr_img)
    ax[i].set_xticks([])
    ax[i].set_yticks([])
plt.show()
fig, ax = plt.subplots(1,10)
fig.set_size_inches(20, 4)
for i in range(10):
    curr_img = np.reshape(noise_train[i], (28,28))
    curr_lbl = train_labels[i]
    ax[i].imshow(curr_img)
    ax[i].set_xticks([])
    ax[i].set_yticks([])
plt.show()

输出:

4、定义两个自动编码器

# Create the model
model = Sequential()
model.add(Conv2D(32, (3, 3),
                 activation='relu',
                 kernel_initializer='he_uniform',
                 padding='same',
                 input_shape=input_shape))
model.add(MaxPooling2D((2, 2),
                       padding='same'))
model.add(Conv2D(64, (3, 3),
                 activation='relu',
                 kernel_initializer='he_uniform',
                 padding='same'))
model.add(MaxPooling2D((2, 2),
                       padding='same'))
model.add(Conv2D(128, (3, 3),
                 activation='relu',
                 kernel_initializer='he_uniform',
                 padding='same'))


model.add(Conv2D(128, (3, 3),
                 activation='relu',
                 kernel_initializer='he_uniform',
                 padding='same'))
model.add(UpSampling2D((2, 2),
                       interpolation='bilinear'))

model.add(Conv2D(64, (3, 3),
                 activation='relu',
                 kernel_initializer='he_uniform',
                 padding='same'))
model.add(UpSampling2D((2, 2),
                       interpolation='bilinear'))
model.add(Conv2D(1, (3, 3),
                 activation='sigmoid',
                 padding='same'))

model.summary()


# model layers for autoencoder
model2 = Sequential()
model2.add(Conv2D(64, kernel_size=(3,3),
                 kernel_constraint=max_norm(max_norm_value),
                 activation = 'relu',
                 kernel_initializer= 'he_uniform',
                 input_shape = input_shape))
model2.add(Conv2D(32, kernel_size=(3,3),
                 kernel_constraint=max_norm(max_norm_value),
                 activation='relu',
                 kernel_initializer='he_uniform'))
model2.add(Conv2DTranspose(32,
                 kernel_size=(3,3),
                 kernel_constraint=max_norm(max_norm_value),
                 activation='relu',
                 kernel_initializer='he_uniform'))
model2.add(Conv2DTranspose(64, kernel_size=(3,3),
                 kernel_constraint= max_norm(max_norm_value),
                 activation='relu',
                 kernel_initializer= 'he_uniform'))
model2.add(Conv2D(1, kernel_size=(3,3),
                 kernel_constraint=max_norm(max_norm_value),
                 activation='sigmoid',
                 padding = 'same'))
model2.summary()

5、训练

model2.compile(optimizer='adam',
              loss = 'binary_crossentropy')
model2.fit(noise_train,
          train_data,
          validation_split= validation_splits,
          epochs=no_epochs,
          batch_size=batch_size)

注意model1用的是无参数的上采样,model2用的是转置卷积

6、去噪展示

fig_samples = noise_test[:10]
fig_original = test_data[:10]
fig_denoise = model2.predict(fig_samples)

for i in range(0, 10):
    noisy_img = noise_test[i]
    original_img = test_data[i]
    denoise_img = fig_denoise[i]

    fig, axes = plt.subplots(1, 3)
    fig.set_size_inches(6, 2.8)
    axes[0].imshow(noisy_img.reshape(28, 28))
    axes[0].set_xticks([])
    axes[0].set_yticks([])
    axes[0].set_title('Noisy')
    axes[1].imshow(original_img.reshape(28, 28))
    axes[1].set_xticks([])
    axes[1].set_yticks([])
    axes[1].set_title('Original')
    axes[2].imshow(denoise_img.reshape(28, 28))
    axes[2].set_xticks([])
    axes[2].set_yticks([])
    axes[2].set_title('Denoised')
plt.show()

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: Auto-encoder是一种深度学习模型,用于将输入数据编码为低维表示,并尽可能地重构原始数据作为输出。在降维方面,PCA会将不同类别的数据混合在一起,而auto-encoder则可以将它们分开。除了降维之外,auto-encoder还有其他用途,比如图片搜索。 引用: 训练一个auto-encoder的过程通常会先固定一些权重参数,然后逐层训练多个自编码器,每个自编码器的输入和输出维度逐渐逼近目标维度。最后,可以使用反向传播来微调网络参数。现在也可以不进行预训练,直接训练auto-encoder。此外,auto-encoder还可以与卷积神经网络(CNN)一起使用。 引用: 特征区分技术是指在auto-encoder中,通过编码器获取的Embedding向量中,可以区分出不同输入数据的特征信息。比如,对于语音输入,可以分别提取出语音内容和说话者的特征。这就是Feature Disentangle的目标。 根据李宏毅老师的讲解,auto-encoder是一种用于降维、重构和特征提取的深度学习模型。它可以将输入数据编码为低维表示,并尽可能地重构原始数据作为输出。除了降维之外,auto-encoder还可以用于图片搜索等任务。训练auto-encoder时,可以使用预训练和微调的方法,也可以直接进行训练。此外,auto-encoder还可以与卷积神经网络(CNN)结合使用。特征区分技术可以用于auto-encoder中,用于提取不同输入数据的特征信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值