残留収縮ネットワークの深さを読み取るための10分

残留深さResNetネットワークは、引用が38295回まで持って、現在Googleニュースでは、コンピュータビジョンとパターン認識最優秀論文賞に2016 IEEE会議を獲得しました。

深残留収縮ネットワークが深い残留改良版のネットワークである、実際には、残留ネットワークの深さ、統合注意メカニズムとソフト閾値関数です

ある程度、残留収縮ネットワークの深さの作動原理は、として理解することができる:それらはゼロに設定されているソフトしきい値関数を介して、注意メカニズムによって通知重要でない機能、または、前記注目することによって、その重要なメカニズムに注目特性は、それらが保持され、これによりノイズの多い信号から有用な特徴を抽出するためにニューラルネットワークの容量の深さを高めます。

1.なぜ深残留収縮ネットワークを提案していますか?

まず、サンプル分類の時点で、サンプルは、必然的にいくつかのノイズが存在することになるガウスのようなノイズ、ピンクノイズ、ラプラスノイズ、。より広く言えば、試料はまた、ノイズとして解釈することができる現在の分類タスク情報とは無関係含む可能性があります。ノイズは、分類結果に不利な影響を有することができます。(ソフト閾値は、多くのノイズ低減アルゴリズムにおける重要なステップです)

例えば、路側チャットで、ボイスチャット、混合車両サイレン、ホイールなどの音であってもよいです。場合音声信号の音声認識、認識結果は必然的にサイレン、車輪の音に影響を与えました。深さ、サイレン、機能に対応する車輪の音の面で学習の観点からは、音声認識に影響を与えないようにするために、内部の深ニューラルネットワークで削除する必要があります。

第二に、偶数サンプルセットと、各サンプルのノイズ量が異なる場合が多いです(これと注目メカニズムは共通している、画像サンプルセットと、例えば、異なっていてもよく配置されている対象物体の像の位置、各ピクチャの注目機構が、配置されている対象物の位置に気付きます)

たとえば、5枚の画像のための猫と犬が訓練された分類器は、最初のイメージは、犬やラットの両方を含んでいてもよい、「犬」としてタグ付け、犬やガチョウの両方が含まれていてもよい二つの画像、最初の三つの画像イヌおよびニワトリの両方を含んでいてもよい、最初の4枚の画像は、最初の5枚の画像が犬とアヒルの両方を含んでいてもよい、イヌおよびロバの両方を含んでいてもよいです。私たちは犬や猫分類器を訓練すると、必然的に分類精度率で、その結果、余分なオブジェクトマウス、ガチョウ、鶏、ロバやアヒルによって妨害されます。私たちはこれらの無関係のマウス、ガチョウ、ニワトリ、アヒルやロバに気づくことができ、そしてそれらに対応する機能を削除した場合、犬や猫分類器の精度を向上させることができます。

2.ソフト閾値は、多くの信号ノイズ低減アルゴリズムにおける重要なステップであります

ソフト閾値は、多くのノイズ低減アルゴリズムにおける重要なステップである絶対値がある閾値特性が削除さよりも小さく、閾値よりも絶対値が大きいほど、前記契約にゼロの方向。これは、次の式で実現することができます。

ソフト閾値出力は、誘導体に入力されます。

以上のことから、ソフトしきい値誘導体は、1またはゼロです。自然とReLU活性化機能は同じです。そのため、ソフト閾値処理アルゴリズムは、深さの学習経験とリスク勾配拡散勾配の爆発を減らすことができます。

ソフト閾値化機能では、閾値は、2つの条件を満たしている必要がありますまず、閾値が正の数であり、第二の、そうでなければ出力はすべてゼロとなり、入力信号の最大しきい値よりも大きくありません。

同時に、しきい値は最高の第三の条件を満たすことができる:各サンプルは、そのノイズ成分に基づいている必要があり、それはそれ自身の独立したスレッショルドを持っています。

サンプルのノイズコンテンツの多くが異なることが多いためです。例えば、多くの場合、試料の同じセットは、サンプルAはノイズの少ない、サンプルBは、よりノイズ含ま含まれている場合、です。それは時のノイズ低減アルゴリズムソフト閾値である場合、サンプルは、より大きなしきい値を使用しなければならないので、サンプルBは、より小さなしきい値を使用すべきです。ニューラルネットワークの深さでは、これらの機能およびしきい値は明確な物理的意味を失ったが、基本的な原理は相互にリンクされているが。すなわち、各サンプルは、そのノイズ成分に基づいている必要があり、それは、それ自身の独立した閾値を有しています。

3.注意メカニズム

コンピュータビジョンの分野における注意のメカニズムを理解することは比較的容易です。迅速に全領域をスキャンすることができ、動物の視覚系は、対象物は、無関係な情報を抑制しつつ、より詳細な情報を抽出するために、対象物に焦点を合わせる、見いだされます。詳細については、記事の注目メカニズムを参照してください。

スクイーズ-と興奮ネットワーク(セネト)が注目の比較的新しいメカニズムの学習の深さです。異なる試料において、異なるチャネル特性は、分類タスクに寄与が異なることが多いです。セネト小サブネットワークを使用して、チャネル特性の各々の大きさを調整するために、重みのセットが得られ、したがって、重みのセットは、各チャネルの特性と乗算されます。このプロセスは、焦点の特徴の異なるサイズの各チャネルに適用されると考えることができます。

このように、各サンプルは、重みの自分の別のセットを持っています。言い換えれば、任意の二つのサンプル、その重みは同じではありません。セネトでは、特定の錘経路、取得「完全接続層のグローバルプール→→→RELU関数完全接続層→シグモイド関数」を

4.注意機構のソフト閾値の深さ

深残留収縮は、フォーカス機構の深さでソフトしきい値を達成するために、サブネットセネトのネットワーク構成を描きます。サブネットワークを介して、青いボックスは、各チャネル特性ソフト閾値のしきい値のセットを取得することを学ぶことができます。

このサブネットワークにおいて、前記第一の全ての入力特徴マップは、その絶対値を求めます。平均および平均をプールし、グローバル後、特性が得られ、Aと称します 別の経路において、プーリング後ビューのグローバル平均の特徴は、小さな完全接続ネットワークに入力されます。最後の層として完全接続ネットワークシグモイド関数、0と1の間で正規化の出力で、αとして示される係数を取得します。最終的な閾値はα×Aのように表すことができます。したがって、閾値は0と1の間の図の特徴の平均数×の絶対値です。このように、ではないだけではなく、あまりにも多く、しきい値が正であることを確認します。

また、異なるサンプルは、異なる閾値を有します。したがって、ある程度、特別な注意機構として理解することができる:現在のタスクのメモ独立特性は、ソフトしきい値により、それらはゼロに設定され、又は、現在のタスクに関連した特徴点に留意、彼らは保持しました。

最後に、積層されたモジュールの特定の数と実質的畳み込み層、バッチの標準化、活性化機能、および出力層等を接続する全プールの全体平均は、残留収縮のネットワークの完全な深さを得ることができます。

ネットワークは、残留収縮広い汎用性の深さを有していてもよいです

深度残差收缩网络事实上是一种通用的特征学习方法。这是因为很多特征学习的任务中,样本中或多或少都会包含一些噪声,以及不相关的信息。这些噪声和不相关的信息,有可能会对特征学习的效果造成影响。例如说:

在图片分类的时候,如果图片同时包含着很多其他的物体,那么这些物体就可以被理解成“噪声”;深度残差收缩网络或许能够借助注意力机制,注意到这些“噪声”,然后借助软阈值化,将这些“噪声”所对应的特征置为零,就有可能提高图像分类的准确率。

在语音识别的时候,如果在声音较为嘈杂的环境里,比如在马路边、工厂车间里聊天的时候,深度残差收缩网络也许可以提高语音识别的准确率,或者给出了一种能够提高语音识别准确率的思路。

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.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:', 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 = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)


def abs_backend(inputs):
    return K.abs(inputs)

def expand_dim_backend(inputs):
    return K.expand_dims(K.expand_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
    return K.spatial_3d_padding(inputs, padding = ((0,0),(0,0),(pad_dim,pad_dim)))

# Residual Shrinakge Block
def residual_shrinkage_block(incoming, nb_blocks, out_channels, downsample=False,
                             downsample_strides=2):
    
    residual = incoming
    in_channels = incoming.get_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)
        abs_mean = GlobalAveragePooling2D()(residual_abs)
        
        # Calculate scaling coefficients
        scales = Dense(out_channels, activation=None, kernel_initializer='he_normal', 
                       kernel_regularizer=l2(1e-4))(abs_mean)
        scales = BatchNormalization()(scales)
        scales = Activation('relu')(scales)
        scales = Dense(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 use 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 use zero padding rather than 1by1 convolution)
        if in_channels != out_channels:
            identity = Lambda(pad_backend)(identity, in_channels, out_channels)
        
        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 = Dense(10, activation='softmax', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(net)
model = Model(inputs=inputs, outputs=outputs)
model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=100, epochs=5, verbose=1, validation_data=(x_test, y_test))

# get results
K.set_learning_phase(0)
DRSN_train_score = model.evaluate(x_train, y_train, batch_size=100, verbose=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, verbose=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
"""
  
from __future__ import division, print_function, absolute_import
  
import tflearn
import numpy as np
import tensorflow as tf
from tflearn.layers.conv import conv_2d
  
# Data loading
from tflearn.datasets import cifar10
(X, Y), (testX, testY) = cifar10.load_data()
  
# Add noise
X = X + np.random.random((50000, 32, 32, 3))*0.1
testX = testX + np.random.random((10000, 32, 32, 3))*0.1
  
# Transform labels to one-hot format
Y = tflearn.data_utils.to_categorical(Y,10)
testY = tflearn.data_utils.to_categorical(testY,10)
  
def residual_shrinkage_block(incoming, nb_blocks, out_channels, downsample=False,
                   downsample_strides=2, activation='relu', batch_norm=True,
                   bias=True, weights_init='variance_scaling',
                   bias_init='zeros', regularizer='L2', weight_decay=0.0001,
                   trainable=True, restore=True, reuse=False, scope=None,
                   name="ResidualBlock"):
      
    # residual shrinkage blocks with channel-wise thresholds
  
    residual = incoming
    in_channels = incoming.get_shape().as_list()[-1]
  
    # Variable Scope fix for older TF
    try:
        vscope = tf.variable_scope(scope, default_name=name, values=[incoming],
                                   reuse=reuse)
    except Exception:
        vscope = tf.variable_op_scope([incoming], scope, name, reuse=reuse)
  
    with vscope as scope:
        name = scope.name #TODO
  
        for i in range(nb_blocks):
  
            identity = residual
  
            if not downsample:
                downsample_strides = 1
  
            if batch_norm:
                residual = tflearn.batch_normalization(residual)
            residual = tflearn.activation(residual, activation)
            residual = conv_2d(residual, out_channels, 3,
                             downsample_strides, 'same', 'linear',
                             bias, weights_init, bias_init,
                             regularizer, weight_decay, trainable,
                             restore)
  
            if batch_norm:
                residual = tflearn.batch_normalization(residual)
            residual = tflearn.activation(residual, activation)
            residual = conv_2d(residual, out_channels, 3, 1, 'same',
                             'linear', bias, weights_init,
                             bias_init, regularizer, weight_decay,
                             trainable, restore)
              
            # get thresholds and apply thresholding
            abs_mean = tf.reduce_mean(tf.reduce_mean(tf.abs(residual),axis=2,keep_dims=True),axis=1,keep_dims=True)
            scales = tflearn.fully_connected(abs_mean, out_channels//4, activation='linear',regularizer='L2',weight_decay=0.0001,weights_init='variance_scaling')
            scales = tflearn.batch_normalization(scales)
            scales = tflearn.activation(scales, 'relu')
            scales = tflearn.fully_connected(scales, out_channels, activation='linear',regularizer='L2',weight_decay=0.0001,weights_init='variance_scaling')
            scales = tf.expand_dims(tf.expand_dims(scales,axis=1),axis=1)
            thres = tf.multiply(abs_mean,tflearn.activations.sigmoid(scales))
            # soft thresholding
            residual = tf.multiply(tf.sign(residual), tf.maximum(tf.abs(residual)-thres,0))
              
  
            # Downsampling
            if downsample_strides > 1:
                identity = tflearn.avg_pool_2d(identity, 1,
                                               downsample_strides)
  
            # Projection to new dimension
            if in_channels != out_channels:
                if (out_channels - in_channels) % 2 == 0:
                    ch = (out_channels - in_channels)//2
                    identity = tf.pad(identity,
                                      [[0, 0], [0, 0], [0, 0], [ch, ch]])
                else:
                    ch = (out_channels - in_channels)//2
                    identity = tf.pad(identity,
                                      [[0, 0], [0, 0], [0, 0], [ch, ch+1]])
                in_channels = out_channels
  
            residual = residual + identity
  
    return residual
  
  
# Real-time data preprocessing
img_prep = tflearn.ImagePreprocessing()
img_prep.add_featurewise_zero_center(per_channel=True)
  
# Real-time data augmentation
img_aug = tflearn.ImageAugmentation()
img_aug.add_random_flip_leftright()
img_aug.add_random_crop([32, 32], padding=4)
  
# Build a Deep Residual Shrinkage Network with 3 blocks
net = tflearn.input_data(shape=[None, 32, 32, 3],
                         data_preprocessing=img_prep,
                         data_augmentation=img_aug)
net = tflearn.conv_2d(net, 16, 3, regularizer='L2', weight_decay=0.0001)
net = residual_shrinkage_block(net, 1, 16)
net = residual_shrinkage_block(net, 1, 32, downsample=True)
net = residual_shrinkage_block(net, 1, 32, downsample=True)
net = tflearn.batch_normalization(net)
net = tflearn.activation(net, 'relu')
net = tflearn.global_avg_pool(net)
# Regression
net = tflearn.fully_connected(net, 10, activation='softmax')
mom = tflearn.Momentum(0.1, lr_decay=0.1, decay_step=20000, staircase=True)
net = tflearn.regression(net, optimizer=mom, loss='categorical_crossentropy')
# Training
model = tflearn.DNN(net, checkpoint_path='model_cifar10',
                    max_checkpoints=10, tensorboard_verbose=0,
                    clip_gradients=0.)
  
model.fit(X, Y, n_epoch=100, snapshot_epoch=False, snapshot_step=500,
          show_metric=True, batch_size=100, shuffle=True, run_id='model_cifar10')
  
training_acc = model.evaluate(X, Y)[0]
validation_acc = model.evaluate(testX, testY)[0]

 

论文网址

M. Zhao, S. Zhong, X. Fu, et al., Deep residual shrinkage networks for fault diagnosis, IEEE Transactions on Industrial Informatics, DOI: 10.1109/TII.2019.2943898

https://ieeexplore.ieee.org/document/8850096

 

おすすめ

転載: www.cnblogs.com/uizhi/p/12239690.html