Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度残差网络+自适应参数化ReLU激活函数(调参记录15)

深度残差网络+自适应参数化ReLU激活函数(调参记录15)

作者头像
用户6915903
修改于 2020-05-06 09:54:23
修改于 2020-05-06 09:54:23
34900
代码可运行
举报
文章被收录于专栏:深度神经网络深度神经网络
运行总次数:0
代码可运行

在调参记录14里,只有2个残差模块,结果遭遇欠拟合了。这次增加一个残差模块试试。

自适应参数化ReLU激活函数的基本原理如下:

自适应参数化ReLU激活函数
自适应参数化ReLU激活函数

Keras代码如下:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 14 04:17:45 2020
Implemented using TensorFlow 1.0.1 and Keras 2.2.1

Minghang Zhao, Shisheng Zhong, Xuyun Fu, Baoping Tang, Shaojiang Dong, Michael Pecht,
Deep Residual Networks with Adaptively Parametric Rectifier Linear Units for Fault Diagnosis, 
IEEE Transactions on Industrial Electronics, 2020,  DOI: 10.1109/TIE.2020.2972458 

@author: Minghang Zhao
"""

from __future__ import print_function
import keras
import numpy as np
from keras.datasets import cifar10
from keras.layers import Dense, Conv2D, BatchNormalization, Activation, Minimum
from keras.layers import AveragePooling2D, Input, GlobalAveragePooling2D, Concatenate, Reshape
from keras.regularizers import l2
from keras import backend as K
from keras.models import Model
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import LearningRateScheduler
K.set_learning_phase(1)

# The data, split between train and test sets
(x_train, y_train), (x_test, y_test) = cifar10.load_data()

# Noised data
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_test = x_test-np.mean(x_train)
x_train = x_train-np.mean(x_train)
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)

# Schedule the learning rate, multiply 0.1 every 1500 epoches
def scheduler(epoch):
    if epoch % 1500 == 0 and epoch != 0:
        lr = K.get_value(model.optimizer.lr)
        K.set_value(model.optimizer.lr, lr * 0.1)
        print("lr changed to {}".format(lr * 0.1))
    return K.get_value(model.optimizer.lr)

# An adaptively parametric rectifier linear unit (APReLU)
def aprelu(inputs):
    # get the number of channels
    channels = inputs.get_shape().as_list()[-1]
    # get a zero feature map
    zeros_input = keras.layers.subtract([inputs, inputs])
    # get a feature map with only positive features
    pos_input = Activation('relu')(inputs)
    # get a feature map with only negative features
    neg_input = Minimum()([inputs,zeros_input])
    # define a network to obtain the scaling coefficients
    scales_p = GlobalAveragePooling2D()(pos_input)
    scales_n = GlobalAveragePooling2D()(neg_input)
    scales = Concatenate()([scales_n, scales_p])
    scales = Dense(channels//8, activation='linear', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(scales)
    scales = BatchNormalization(momentum=0.9, gamma_regularizer=l2(1e-4))(scales)
    scales = Activation('relu')(scales)
    scales = Dense(channels, activation='linear', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(scales)
    scales = BatchNormalization(momentum=0.9, gamma_regularizer=l2(1e-4))(scales)
    scales = Activation('sigmoid')(scales)
    scales = Reshape((1,1,channels))(scales)
    # apply a paramtetric relu
    neg_part = keras.layers.multiply([scales, neg_input])
    return keras.layers.add([pos_input, neg_part])

# Residual Block
def residual_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(momentum=0.9, gamma_regularizer=l2(1e-4))(residual)
        residual = aprelu(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(momentum=0.9, gamma_regularizer=l2(1e-4))(residual)
        residual = aprelu(residual)
        residual = Conv2D(out_channels, 3, padding='same', kernel_initializer='he_normal', 
                          kernel_regularizer=l2(1e-4))(residual)
        
        # Downsampling
        if downsample_strides > 1:
            identity = AveragePooling2D(pool_size=(1,1), strides=(2,2))(identity)
            
        # Zero_padding to match channels
        if in_channels != out_channels:
            zeros_identity = keras.layers.subtract([identity, identity])
            identity = keras.layers.concatenate([identity, zeros_identity])
            in_channels = out_channels
        
        residual = keras.layers.add([residual, identity])
    
    return residual


# define and train a model
inputs = Input(shape=(32, 32, 3))
net = Conv2D(16, 3, padding='same', kernel_initializer='he_normal', kernel_regularizer=l2(1e-4))(inputs)
net = residual_block(net, 1, 16, downsample=False)
net = residual_block(net, 1, 32, downsample=True)
# net = residual_block(net, 2, 32, downsample=False)
net = residual_block(net, 1, 64, downsample=True)
# net = residual_block(net, 2, 64, downsample=False)
net = BatchNormalization(momentum=0.9, gamma_regularizer=l2(1e-4))(net)
net = aprelu(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)
sgd = optimizers.SGD(lr=0.1, decay=0., momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# data augmentation
datagen = ImageDataGenerator(
    # randomly rotate images in the range (deg 0 to 180)
    rotation_range=30,
    # Range for random zoom
    zoom_range = 0.2,
    # shear angle in counter-clockwise direction in degrees
    shear_range = 30,
    # randomly flip images
    horizontal_flip=True,
    # randomly shift images horizontally
    width_shift_range=0.125,
    # randomly shift images vertically
    height_shift_range=0.125)

reduce_lr = LearningRateScheduler(scheduler)
# fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(x_train, y_train, batch_size=1000),
                    validation_data=(x_test, y_test), epochs=5000, 
                    verbose=1, callbacks=[reduce_lr], workers=4)

# get results
K.set_learning_phase(0)
DRSN_train_score = model.evaluate(x_train, y_train, batch_size=1000, 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=1000, verbose=0)
print('Test loss:', DRSN_test_score[0])
print('Test accuracy:', DRSN_test_score[1])

实验结果如下:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
Epoch 2575/5000
50/50 [=========] - 10s 197ms/step - loss: 0.3505 - acc: 0.9039 - val_loss: 0.4548 - val_acc: 0.8745
Epoch 2576/5000
50/50 [=========] - 10s 198ms/step - loss: 0.3571 - acc: 0.9003 - val_loss: 0.4483 - val_acc: 0.8732
Epoch 2577/5000
50/50 [=========] - 10s 194ms/step - loss: 0.3536 - acc: 0.9033 - val_loss: 0.4547 - val_acc: 0.8725
Epoch 2578/5000
50/50 [=========] - 10s 196ms/step - loss: 0.3514 - acc: 0.9033 - val_loss: 0.4429 - val_acc: 0.8766

程序还没跑完,似乎也没必要跑完了。

训练集上还没拟合得很好,测试集准确率已经低于训练集准确率大约2.5%了。这是同时存在欠拟合和过拟合呀!

Minghang Zhao, Shisheng Zhong, Xuyun Fu, Baoping Tang, Shaojiang Dong, Michael Pecht, Deep Residual Networks with Adaptively Parametric Rectifier Linear Units for Fault Diagnosis, IEEE Transactions on Industrial Electronics, 2020, DOI: 10.1109/TIE.2020.2972458

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

————————————————

版权声明:本文为CSDN博主「dangqing1988」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/dangqing1988/article/details/105849291

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录14)
本文介绍哈工大团队提出的一种动态ReLU(Dynamic ReLU)激活函数,即自适应参数化ReLU激活函数,原本是应用在基于一维振动信号的故障诊断,能够让每个样本有自己独特的ReLU参数,在2019年5月3日投稿至IEEE Transactions on Industrial Electronics,2020年1月24日录用,2020年2月13日在IEEE官网公布。
用户7368967
2020/05/27
4810
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录14)
深度残差网络+自适应参数化ReLU激活函数(调参记录17)
在调参记录16的基础上,增加了两个残差模块,继续测试其在Cifar10数据集上的效果。
用户6915903
2020/05/04
3250
深度残差网络+自适应参数化ReLU激活函数(调参记录17)
深度残差网络+自适应参数化ReLU激活函数(调参记录14)
这次再尝试解决过拟合,把残差模块的数量减少到2个,自适应参数化ReLU激活函数里面第一个全连接层的权重数量,减少为之前的1/8,批量大小设置为1000(主要是为了省时间)。
用户6915903
2020/05/04
3010
深度残差网络+自适应参数化ReLU激活函数(调参记录14)
深度残差网络+自适应参数化ReLU激活函数(调参记录6)
https://blog.csdn.net/dangqing1988/article/details/105627351
用户6915903
2020/04/22
4560
深度残差网络+自适应参数化ReLU激活函数(调参记录6)
深度残差网络+自适应参数化ReLU激活函数(调参记录16)
在调参记录15的基础上,将第一个残差模块的卷积核数量,从16个增加到32个,同时将自适应参数化ReLU激活函数中第一个全连接层的神经元个数改成原先的1/16,继续测试其在Cifar10数据集上的效果。
用户6915903
2020/05/04
4790
深度残差网络+自适应参数化ReLU激活函数(调参记录16)
深度残差网络+自适应参数化ReLU激活函数(调参记录12)
本文在调参记录10的基础上,在数据增强部分添加了zoom_range = 0.2,将训练迭代次数增加到5000个epoch,批量大小改成了625,测试Adaptively Parametric ReLU(APReLU)激活函数在Cifar10图像集上的效果。
用户6915903
2020/05/04
4410
深度残差网络+自适应参数化ReLU激活函数(调参记录12)
深度残差网络+自适应参数化ReLU激活函数(调参记录7)
https://blog.csdn.net/dangqing1988/article/details/105628681
用户6915903
2020/04/22
3820
深度残差网络+自适应参数化ReLU激活函数(调参记录7)
深度残差网络+自适应参数化ReLU激活函数(调参记录13)
从以往的调参结果来看,过拟合是最主要的问题。本文在调参记录12的基础上,将层数减少,减到9个残差模块,再试一次。
用户6915903
2020/05/04
3710
深度残差网络+自适应参数化ReLU激活函数(调参记录13)
深度残差网络+自适应参数化ReLU激活函数(调参记录5)
https://blog.csdn.net/dangqing1988/article/details/105610584
用户6915903
2020/04/22
4830
深度残差网络+自适应参数化ReLU激活函数(调参记录5)
深度残差网络+自适应参数化ReLU激活函数(调参记录8)
https://blog.csdn.net/dangqing1988/article/details/105670981
用户6915903
2020/04/22
4030
深度残差网络+自适应参数化ReLU激活函数(调参记录8)
深度残差网络+自适应参数化ReLU激活函数(调参记录1)
本文采用了深度残差网络和自适应参数化ReLU激活函数,构造了一个网络(有9个残差模块,卷积核的个数比较少,最少是8个,最多是32个),在Cifar10数据集上进行了初步的尝试。
用户6915903
2020/04/21
3850
深度残差网络+自适应参数化ReLU激活函数(调参记录1)
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录13)
从以往的调参结果来看,过拟合是最主要的问题。本文在调参记录12的基础上,将层数减少,减到9个残差模块,再试一次。
用户7368967
2020/05/27
4610
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录13)
深度残差网络+自适应参数化ReLU激活函数(调参记录10)
本文在调参记录9的基础上,在数据增强部分添加了shear_range = 30,测试Adaptively Parametric ReLU(APReLU)激活函数在Cifar10图像集上的效果。
用户6915903
2020/04/24
5630
深度残差网络+自适应参数化ReLU激活函数(调参记录10)
深度残差网络+自适应参数化ReLU激活函数(调参记录20)Cifar10~94.17%
在之前的调参记录18中,是将深度残差网络ResNet中的所有ReLU都替换成了自适应参数化ReLU(Adaptively Parametric ReLU,APReLU)。
用户6915903
2020/05/17
4440
深度残差网络+自适应参数化ReLU激活函数(调参记录20)Cifar10~94.17%
深度残差网络+自适应参数化ReLU激活函数(调参记录19)Cifar10~93.96%
由于调参记录18依然存在过拟合,本文将自适应参数化ReLU激活函数中最后一层的神经元个数减少为1个,继续测试深度残差网络+自适应参数化ReLU激活函数在Cifar10数据集上的效果。
用户6915903
2020/05/09
4350
深度残差网络+自适应参数化ReLU激活函数(调参记录19)Cifar10~93.96%
深度残差网络+自适应参数化ReLU激活函数(调参记录11)
本文在调参记录10的基础上,将残差模块的数量从27个增加到60个,测试采用Adaptively Parametric ReLU(APReLU)激活函数的深度残差网络,在Cifar10图像集上的效果。
用户6915903
2020/05/04
3800
深度残差网络+自适应参数化ReLU激活函数(调参记录11)
深度残差网络+自适应参数化ReLU激活函数(调参记录4)
https://blog.csdn.net/dangqing1988/article/details/105601313
用户6915903
2020/04/22
4760
深度残差网络+自适应参数化ReLU激活函数(调参记录4)
一种Dynamic ReLU:自适应参数化ReLU激活函数(调参记录1)
自适应参数化ReLU是一种动态ReLU(Dynamic ReLU)激活函数,在2019年5月3日投稿至IEEE Transactions on Industrial Electronics,在2020年1月24日(农历大年初一)录用,于2020年2月13日在IEEE官网发布预览版。
用户7368967
2020/05/23
5320
一种Dynamic ReLU:自适应参数化ReLU激活函数(调参记录1)
深度残差网络+自适应参数化ReLU激活函数(调参记录18)Cifar10~94.28%
本文将残差模块的数量增加到27个。其实之前也这样做过,现在的区别在于,自适应参数化ReLU激活函数中第一个全连接层中的神经元个数设置成了特征通道数量的1/16。同样是在Cifar10数据集上进行测试。
用户6915903
2020/05/09
3920
深度残差网络+自适应参数化ReLU激活函数(调参记录18)Cifar10~94.28%
深度残差网络+自适应参数化ReLU激活函数(调参记录2)
https://blog.csdn.net/dangqing1988/article/details/105590515
用户6915903
2020/04/21
4530
深度残差网络+自适应参数化ReLU激活函数(调参记录2)
推荐阅读
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录14)
4810
深度残差网络+自适应参数化ReLU激活函数(调参记录17)
3250
深度残差网络+自适应参数化ReLU激活函数(调参记录14)
3010
深度残差网络+自适应参数化ReLU激活函数(调参记录6)
4560
深度残差网络+自适应参数化ReLU激活函数(调参记录16)
4790
深度残差网络+自适应参数化ReLU激活函数(调参记录12)
4410
深度残差网络+自适应参数化ReLU激活函数(调参记录7)
3820
深度残差网络+自适应参数化ReLU激活函数(调参记录13)
3710
深度残差网络+自适应参数化ReLU激活函数(调参记录5)
4830
深度残差网络+自适应参数化ReLU激活函数(调参记录8)
4030
深度残差网络+自适应参数化ReLU激活函数(调参记录1)
3850
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录13)
4610
深度残差网络+自适应参数化ReLU激活函数(调参记录10)
5630
深度残差网络+自适应参数化ReLU激活函数(调参记录20)Cifar10~94.17%
4440
深度残差网络+自适应参数化ReLU激活函数(调参记录19)Cifar10~93.96%
4350
深度残差网络+自适应参数化ReLU激活函数(调参记录11)
3800
深度残差网络+自适应参数化ReLU激活函数(调参记录4)
4760
一种Dynamic ReLU:自适应参数化ReLU激活函数(调参记录1)
5320
深度残差网络+自适应参数化ReLU激活函数(调参记录18)Cifar10~94.28%
3920
深度残差网络+自适应参数化ReLU激活函数(调参记录2)
4530
相关推荐
【哈工大团队】动态ReLU:自适应参数化ReLU及Keras代码(调参记录14)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验