残差网络的新改进:深度残差收缩网络

更新时间:2023-05-06 11:32:46 阅读: 评论:0

残差⽹络的新改进:深度残差收缩⽹络
残差⽹络ResNet获得了2016年IEEE Conference on CVPR的最佳论⽂奖,现在在⾕歌学术的引⽤次数已⾼达38295次。
深度残差收缩⽹络是深度残差⽹络的⼀种新的改进版本,其实是深度残差⽹络、注意⼒机制和软阈值函数的集成。
在⼀定程度上,深度残差收缩⽹络的⼯作原理,可以理解为:通过注意⼒机制注意到不重要的特征,通过软阈值函数将它们置为零;或者说,通过注意⼒机制注意到重要的特征,将它们保留下来,从⽽加强深度神经⽹络从含噪声信号中提取有⽤特征的能⼒。
1.为什么要提出深度残差收缩⽹络呢?
⾸先,在对样本进⾏分类的时候,样本中不可避免地会有⼀些噪声,就像⾼斯噪声、粉⾊噪声、拉普拉斯噪声等。更⼴义地讲,样本中很可能包含着与当前分类任务⽆关的信息,这些信息也可以理解为噪声。这些噪声可能会对分类效果产⽣不利的影响。(软阈值化是许多信号降噪算法中的⼀个关键步骤)
举例来说,在马路边聊天的时候,聊天的声⾳⾥就可能会混杂车辆的鸣笛声、车轮声等等。当对这些声⾳信号进⾏语⾳识别的时候,识别效果不可避免地会受到鸣笛声、车轮声的影响。从深度学习的⾓度来
讲,这些鸣笛声、车轮声所对应的特征,就应该在深度神经⽹络内部被删除掉,以避免对语⾳识别的效果造成影响。
其次,即使是同⼀个样本集,各个样本的噪声量也往往是不同的。(这和注意⼒机制有相通之处;以⼀个图像样本集为例,各张图⽚中⽬标物体所在的位置可能是不同的;注意⼒机制可以针对每⼀张图⽚,注意到⽬标物体所在的位置)
例如,当训练猫狗分类器的时候,对于标签为“狗”的5张图像,第1张图像可能同时包含着狗和⽼⿏,第2张图像可能同时包含着狗和鹅,第3张图像可能同时包含着狗和鸡,第4张图像可能同时包含着狗和驴,第5张图像可能同时包含着狗和鸭⼦。我们在训练猫狗分类器的时候,就不可避免地会受到⽼⿏、鹅、鸡、驴和鸭⼦等⽆关物体的⼲扰,造成分类准确率下降。如果我们能够注意到这些⽆关的⽼⿏、鹅、鸡、驴和鸭⼦,将它们所对应的特征删除掉,就有可能提⾼猫狗分类器的准确率。
2.软阈值化是许多信号降噪算法的核⼼步骤
软阈值化,是很多信号降噪算法的核⼼步骤,将绝对值⼩于某个阈值的特征删除掉,将绝对值⼤于这个阈值的特征朝着零的⽅向进⾏收缩。它可以通过以下公式来实现:
软阈值化的输出对于输⼊的导数为
由上可知,软阈值化的导数要么是1,要么是0。这个性质是和ReLU激活函数是相同的。因此,软阈值化也能够减⼩深度学习算法遭遇梯度弥散和梯度爆炸的风险。
在软阈值化函数中,阈值的设置必须符合两个的条件:第⼀,阈值是正数;第⼆,阈值不能⼤于输⼊信号的最⼤值,否则输出会全部为零。
同时,阈值最好还能符合第三个条件:每个样本应该根据⾃⾝的噪声含量,有着⾃⼰独⽴的阈值。
这是因为,很多样本的噪声含量经常是不同的。例如经常会有这种情况,在同⼀个样本集⾥⾯,样本
A所含噪声较少,样本B所含噪声较多。那么,如果是在降噪算法⾥进⾏软阈值化的时候,样本A就应该采⽤较⼤的阈值,样本B就应该采⽤较⼩的阈值。在深度神经⽹络中,虽然这些特征和阈值失去了明确的物理意义,但是基本的道理还是相通的。也就是说,每个样本应该根据⾃⾝的噪声含量,有着⾃⼰独⽴的阈值。
3.注意⼒机制
注意⼒机制在计算机视觉领域是⽐较容易理解的。动物的视觉系统可以快速扫描全部区域,发现⽬标物体,进⽽将注意⼒集中在⽬标物体上,以提取更多的细节,同时抑制⽆关信息。具体请参照注意⼒机制⽅⾯的⽂章。
Squeeze-and-Excitation Network(SENet)是⼀种较新的注意⼒机制下的深度学习⽅法。在不同的样本中,不同的特征通道,在分类任务中的贡献⼤⼩,往往是不同的。SENet采⽤⼀个⼩型的⼦⽹络,获得⼀组权重,进⽽将这组权重与各个通道的特征分别相乘,以调整各个通道特征的⼤⼩。这个过程,就可以认为是在施加不同⼤⼩的注意⼒在各个特征通道上。
在这种⽅式下,每⼀个样本,都会有⾃⼰独⽴的⼀组权重。换⾔之,任意的两个样本,它们的权重,都是不⼀样的。在SENet中,获得权重的具体路径是,“全局池化→全连接层→ReLU函数→全连接层→Sigmoid函数”。
4.深度注意⼒机制下的软阈值化
深度残差收缩⽹络借鉴了上述SENet的⼦⽹络结构,以实现深度注意⼒机制下的软阈值化。通过蓝⾊框内的⼦⽹络,就可以学习得到⼀组阈值,对各个特征通道进⾏软阈值化。
在这个⼦⽹络中,⾸先对输⼊特征图的所有特征,求它们的绝对值。然后经过全局均值池化和平均,获得⼀个特征,记为A。在另⼀条路径中,全局均值池化之后的特征图,被输⼊到⼀个⼩型的全连接⽹络。这个全连接⽹络以Sigmoid函数作为最后⼀层,将输出归⼀化到0和1之间,获得⼀个系数,记为α。最终的阈值可以表⽰为α×A。因此,阈值就是,⼀个0和1之间的数字×特征图的绝对值的平均。这种⽅式,不仅保证了阈值为正,⽽且不会太⼤。
⽽且,不同的样本就有了不同的阈值。因此,在⼀定程度上,可以理解成⼀种特殊的注意⼒机制:注意到与当前任务⽆关的特征,通过软阈值化,将它们置为零;或者说,注意到与当前任务有关的特征,将它们保留下来。
最后,堆叠⼀定数量的基本模块以及卷积层、批标准化、激活函数、全局均值池化以及全连接输出层等,就得到了完整的深度残差收缩⽹络。
5.深度残差收缩⽹络或许有更⼴泛的通⽤性
深度残差收缩⽹络事实上是⼀种通⽤的特征学习⽅法。这是因为很多特征学习的任务中,样本中或多或少都会包含⼀些噪声,以及不相关的信息。这些噪声和不相关的信息,有可能会对特征学习的效果造成影响。例如说:
在图⽚分类的时候,如果图⽚同时包含着很多其他的物体,那么这些物体就可以被理解成“噪声”;深度残差收缩⽹络或许能够借助注意⼒机制,注意到这些“噪声”,然后借助软阈值化,将这些“噪声”所对应的特征置为零,就有可能提⾼图像分类的准确率。
在语⾳识别的时候,如果在声⾳较为嘈杂的环境⾥,⽐如在马路边、⼯⼚车间⾥聊天的时候,深度残差收缩⽹络也许可以提⾼语⾳识别的准确率,或者给出了⼀种能够提⾼语⾳识别准确率的思路。
6.Keras和TFLearn程序简介
本程序以图像分类为例,构建了⼩型的深度残差收缩⽹络,超参数也未进⾏优化。为追求⾼准确率的话,可以适当增加深度,增加训练迭代次数,以及适当调整超参数。下⾯是Keras程序:
#!/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.datats import mnist
from keras.layers import Den, Conv2D, BatchNormalization, Activation
from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D
from keras.optimizers import Adam
ularizers import l2
from keras import backend as K
dels import Model
from import Lambda
K.t_learning_pha(1)
# Input image dimensions
img_rows, img_cols =28,28
# The data, split between train and test ts
# The data, split between train and test ts
(x_train, y_train),(x_test, y_test)= mnist.load_data()
if K.image_data_format()=='channels_first':
x_train = shape(x_train.shape[0],1, img_rows, img_cols)
x_test = shape(x_test.shape[0],1, img_rows, img_cols)
input_shape =(1, img_rows, img_cols)
el:
x_train = shape(x_train.shape[0], img_rows, img_cols,1)
x_test = shape(x_test.shape[0], img_rows, img_cols,1)
input_shape =(img_rows, img_cols,1)
# Noid 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:', x_train.shape)
print(x_train.shape[0],'train samples')
print(x_test.shape[0],'test samples')
# convert class vectors to binary class matrices
y_train = _categorical(y_train,10)
y_test = _categorical(y_test,10)
def abs_backend(inputs):
return K.abs(inputs)
def expand_dim_backend(inputs):
pand_pand_dims(inputs,1),1)
def sign_backend(inputs):
return K.sign(inputs)
def pad_backend(inputs, in_channels, out_channels):
pad_dim =(out_channels - in_channels)//2
inputs = K.expand_dims(inputs,-1)
inputs = K.spatial_3d_padding(inputs,((0,0),(0,0),(pad_dim,pad_dim)),'channels_last')
return K.squeeze(inputs,-1)
# Residual Shrinakge Block
def residual_shrinkage_block(incoming, nb_blocks, out_channels, downsample=Fal,
downsample_strides=2):
residual = incoming
in_channels = _shape().as_list()[-1]
for i in range(nb_blocks):
identity = residual
if not downsample:
downsample_strides =1
residual = BatchNormalization()(residual)
residual = Activation('relu')(residual)
residual = Conv2D(out_channels,3, strides=(downsample_strides, downsample_strides),
padding='same', kernel_initializer='he_normal',
kernel_regularizer=l2(1e-4))(residual)
residual = BatchNormalization()(residual)
residual = Activation('relu')(residual)
residual = Conv2D(out_channels,3, padding='same', kernel_initializer='he_normal',
kernel_regularizer=l2(1e-4))(residual)
# Calculate global means
residual_abs = Lambda(abs_backend)(residual)
residual_abs = Lambda(abs_backend)(residual)
abs_mean = GlobalAveragePooling2D()(residual_abs)
# Calculate scaling coefficients
scales = Den(out_channels, activation=None, kernel_initializer='he_normal',
kernel_regularizer=l2(1e-4))(abs_mean)
scales = BatchNormalization()(scales)
scales = Activation('relu')(scales)
scales = Den(out_channels, activation='sigmoid', kernel_regularizer=l2(1e-4))(scales)
scales = Lambda(expand_dim_backend)(scales)
# Calculate thresholds
thres = keras.layers.multiply([abs_mean, scales])
# Soft thresholding
sub = keras.layers.subtract([residual_abs, thres])
zeros = keras.layers.subtract([sub, sub])
n_sub = keras.layers.maximum([sub, zeros])
residual = keras.layers.multiply([Lambda(sign_backend)(residual), n_sub])
# Downsampling (it is important to u the pooL-size of (1, 1))
if downsample_strides >1:
identity = AveragePooling2D(pool_size=(1,1), strides=(2,2))(identity)
# Zero_padding to match channels (it is important to u zero padding rather than 1by1 convolution)
if in_channels != out_channels:
identity = Lambda(pad_backend, arguments={'in_channels':in_channels,'out_channels':out_channels})(identity)        residual = keras.layers.add([residual, identity])
return residual
# define and train a model
inputs = Input(shape=input_shape)
net = Conv2D(8,3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(inputs)
net = residual_shrinkage_block(net,1,8, downsample=True)
net = BatchNormalization()(net)
net = Activation('relu')(net)
net = GlobalAveragePooling2D()(net)
outputs = Den(10, activation='softmax', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(net)
model = Model(inputs=inputs, outputs=outputs)
model.fit(x_train, y_train, batch_size=100, epochs=5, verbo=1, validation_data=(x_test, y_test))
# get results
K.t_learning_pha(0)
DRSN_train_score = model.evaluate(x_train, y_train, batch_size=100, verbo=0)
print('Train loss:', DRSN_train_score[0])
print('Train accuracy:', DRSN_train_score[1])
DRSN_test_score = model.evaluate(x_test, y_test, batch_size=100, verbo=0)
print('Test loss:', DRSN_test_score[0])
print('Test accuracy:', DRSN_test_score[1])
下⾯是TFLearn程序:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Dec 23 21:23:09 2019
Implemented using TensorFlow 1.0 and TFLearn 0.3.2
M. Zhao, S. Zhong, X. Fu, B. Tang, M. Pecht, Deep Residual Shrinkage Networks for Fault Diagnosis,
IEEE Transactions on Industrial Informatics, 2019, DOI: 10.1109/TII.2019.2943898
@author: super_9527
"""

本文发布于:2023-05-06 11:32:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/97896.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:深度   特征   阈值   注意   噪声   机制   样本
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图