TensorFlow2 реализует автоэнкодер шумоподавления

искусственный интеллект глубокое обучение
TensorFlow2 реализует автоэнкодер шумоподавления

«Это 8-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

Шумоподавляющий автоэнкодер (DAE)

Прежде чем представить Denoising Autoencoder (DAE), давайте сначала представим пример сценария использования DAE.Когда мы делаем снимки ночью или в других темных условиях, наши изображения всегда наполнены большим количеством шума., что серьезно влияет на качество изображения. качество изображения, и целью DAE является удаление шума на этих изображениях. Чтобы лучше объяснить DAE, используется простой набор данных MNIST, чтобы продемонстрировать наше внимание к тому, что мы знаем о DAE. Как показано на изображении ниже, отображаются три набора цифр MNIST. Верхний ряд каждой группы — это исходные изображения; средний ряд показывает входные данные DAE (зашумленные изображения), которые представляют собой исходные изображения, искаженные шумом, когда шума слишком много, нам будет трудно прочитать поврежденные числа; последний строка показывает выходные данные DAE (изображения с шумоподавлением).

DAE示例

Tips:Если вы мало знаете об автоэнкодерах, вы можете обратиться кПодробное объяснение и реализация модели автоэнкодера (реализовано с помощью tensorflow2.x).

Теперь давайте на самом деле создадим DAE для удаления шума из изображения.

Архитектура модели DAE

DAE模型架构

В соответствии с введением DAE вход можно определить как:

x=xorig+noisex = x_{orig} + noise

вxorigx_{orig}Указывает на шумnoisenoiseПоврежденное необработанное изображение MNIST, целью кодировщика является изучение скрытых векторов.zz. Функция потерь DAE выражается как:

L(xorig,x~)=MSE=1mi=1i=m(xorigix~i)2\mathcal L(x_{orig}, \tilde x)=MSE=\frac 1 m \sum_{i=1} ^{i=m}(x_{orig_i}-\tilde x_i)^2

в,mmразмер вывода, например, в наборе данных MNIST,m=width×height×channels=28×28×1=784м = ширина × высота × каналы = 28 × 28 × 1 = 784.xorigix_{orig_i}иxix_iсоответственноxorigx_{orig}иx~\tilde xэлементы в .

Реализация DAE

предварительная обработка данных

Чтобы реализовать DAE, сначала необходимо создать обучающий набор данных, входные данные — это цифры MNIST с добавленным шумом, а выходные данные обучения — исходные чистые цифры MNIST. Добавленный шум должен удовлетворять распределению Гаусса, среднеемю=0.5μ = 0,5, стандартное отклонениео=0.5σ = 0,5. Поскольку добавление случайного шума может привести к недопустимым значениям пикселей меньше 0 или больше 1, значения пикселей необходимо обрезать до диапазона [0,0, 1,0].

# 数据加载
(x_train,_),(x_test,_) = keras.datasets.mnist.load_data()

# 数据预处理
image_size = x_train.shape[1]
x_train = np.reshape(x_train,[-1,image_size,image_size,1])
x_test = np.reshape(x_test,[-1,image_size,image_size,1])
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

# 产生高斯分布的噪声
noise = np.random.normal(loc=0.5,scale=0.5,size=x_train.shape)
x_train_noisy = x_train + noise
noise = np.random.normal(loc=0.5,scale=0.5,size=x_test.shape)
x_test_noisy = x_test + noise

# 将像素值裁剪为[0.0,1.0]范围内
x_train_noisy = np.clip(x_train_noisy,0.0,1.0)
x_test_noisy = np.clip(x_test_noisy,0.0,1.0)

Построение модели и обучение модели

#编码器
inputs = keras.layers.Input(shape=input_shape,name='encoder_input')
x = inputs
for filters in layer_filters:
    x = keras.layers.Conv2D(filters=filters,
            kernel_size=kernel_size,
            strides=2,
            activation='relu',
            padding='same')(x)
shape = keras.backend.int_shape(x)

x = keras.layers.Flatten()(x)
latent = keras.layers.Dense(latent_dim,name='latent_vector')(x)
encoder = keras.Model(inputs,latent,name='encoder')

# 解码器
latent_inputs = keras.layers.Input(shape=(latent_dim,),name='decoder_input')
x = keras.layers.Dense(shape[1]*shape[2]*shape[3])(latent_inputs)
x = keras.layers.Reshape((shape[1],shape[2],shape[3]))(x)
for filters in layer_filters[::-1]:
    x = keras.layers.Conv2DTranspose(filters=filters,
            kernel_size=kernel_size,
            strides=2,
            padding='same',
            activation='relu')(x)
outputs = keras.layers.Conv2DTranspose(filters=1,
        kernel_size=kernel_size,
        padding='same',
        activation='sigmoid',
        name='decoder_output')(x)
decoder = keras.Model(latent_inputs,outputs,name='decoder')

autoencoder = keras.Model(inputs,decoder(encoder(inputs)),name='autoencoder')
# 模型编译与训练
autoencoder.compile(loss='mse',optimizer='adam')
autoencoder.fit(x_train_noisy,
        x_train,validation_data=(x_test_noisy,x_test),
        epochs=10,
        batch_size=batch_size)

# 模型测试
x_decoded = autoencoder.predict(x_test_noisy)

Показать результаты

模型效果

Как показано на рисунке выше, когда уровень шума изменяется ото=0.5σ=0,5увеличить доо=0.75σ=0,75ио=1.0σ=1,0, DAE обладает определенной надежностью и может лучше восстанавливать исходный образ. Но когдао=1.0σ=1,0Когда некоторые номера не восстанавливаются правильно.