本文简介了一种新的深度注意力算法,即深度残差收缩网络(Deep Residual Shrinkage Network)。从功能上讲,深度残差收缩网络是一种面向强噪声或者高度冗余数据的特征学习方法。本文首先回顾了相关基础知识,然后介绍了深度残差收缩网络的动机和具体实现,希望对大家有所帮助。
1.前言
深度残差收缩网络主要建立在三个部分的基础之上:深度残差网络、软阈值函数和注意力机制。
1.1 残差神经网络
深度残差网络无疑是近年来最成功的深度学习算法之一,在谷歌学术上的引用已经突破四万次。相较于普通的卷积神经网络,深度残差网络采用跨层恒等路径的方式,缓解了深层网络的训练难度。
1.2 软阈值函数
软阈值函数是大部分降噪方法的核心步骤。首先,我们需要设置一个正数阈值。该阈值不能太大,即不能大于输入数据绝对值的最大值,否则输出会全部为零。然后,软阈值函数会将绝对值低于这个阈值的输入数据设置为零,并且将绝对值大于这个阈值的输入数据也朝着零收缩。
1.3 注意力机制
注意力机制是近年来深度学习领域的超级研究热点,而Squeeze-and-Excitation Network (SENet)则是最为经典的注意力算法之一。
2. 残差收缩神经网络
深度残差收缩网络融合了深度残差网络、SENet和软阈值函数。如下图所示,深度残差收缩网络就是将残差模式下的SENet中的“重新加权”替换成了“软阈值化”。在SENet中,所嵌入的小型网络是用于获取一组权值系数;在深度残差收缩网络中,该小型网络则是用于获取一组阈值。
#用于二维图像的分类
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Dec 28 23:24:05 2019
Implemented using TensorFlow 1.0.1 and Keras 2.2.1
M. Zhao, S. Zhong, X. Fu, et al., Deep Residual Shrinkage Networks for Fault Diagnosis,
IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898
@author: super_9527
"""
from __future__ import print_function
import keras
import numpy as np
from keras.datasets import mnist
from keras.layers import Dense, Conv2D, BatchNormalization, Activation
from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.regularizers import l2
from keras import backend as K
from keras.models import Model
from keras.layers.core import Lambda
K.set_learning_phase(1)
# Input image dimensions
img_rows, img_cols = 28, 28
# The data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
# Noised data
x_train = x_train.astype('float32') / 255. + 0.5*np.random.random([x_train.shape[0], img_rows, img_cols, 1])
x_test = x_test.astype('float32') / 255. + 0.5*np.random.random([x_test.shape[0], img_rows, img_cols, 1])
print('x_train shape:'