首页 > 解决方案 > 我当前对残差块的实现是否正确?

问题描述

我有一个问题要问你,我使用 keras 编写了我认为是残差网络架构脚本,但我不确定我是否能够重现残差块。

我想确保我的脚本确实重现了架构。我的 python 脚本技能不是最佳的,所以我尝试按照我的理解制作剩余块。这很麻烦但很简单,我将它们分成两部分(非常麻烦......);一个是标准残差块,称为res something ,另一个是下采样时称为red。然后我将它们全部堆叠起来。值得注意的是,我使用的是预激活块(所以 BN--> Relu --> Layer)

这是处理残差块的脚本部分;

def res1(Input):
    shortcut = Input
    layer0 = BatchNormalization()(Input)
    layer0 = Activation('relu')(layer0)
    layer0 = Conv2D(filters=16, kernel_size=(1,1), strides=(1,1), padding='same', kernel_regularizer=regularizers.l2(weight_decay), kernel_initializer='he_normal')(layer0)
    layer0 = BatchNormalization()(layer0)
    layer0 = Activation('relu')(layer0)
    layer0 = Conv2D(filters=16, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=regularizers.l2(weight_decay),kernel_initializer='he_normal')(layer0)
    layer0 = BatchNormalization()(layer0)
    layer0 = Activation('relu')(layer0)
    layer0 = Conv2D(filters=64, kernel_size=(1,1), strides=(1,1), padding='same', kernel_regularizer=regularizers.l2(weight_decay), kernel_initializer='he_normal')(layer0)
    layer0 = add([layer0, shortcut])
    layer0 = Activation('relu')(layer0)
    return layer0

def red1(Input):
    shortcut = Conv2D(filters=128, kernel_size=(1,1), strides=(2,2), padding='same', kernel_regularizer=regularizers.l2(weight_decay), kernel_initializer='he_normal')(Input)
    shortcut = BatchNormalization()(shortcut)
    layer0 = BatchNormalization()(Input)
    layer0 = Activation('relu')(layer0)
    layer0 = Conv2D(filters=64, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=regularizers.l2(weight_decay), kernel_initializer='he_normal')(layer0)
    layer0 = BatchNormalization()(layer0)
    layer0 = Activation('relu')(layer0)
    layer0 = Conv2D(filters=64, kernel_size=(3,3), strides=(1,1), padding='same', kernel_regularizer=regularizers.l2(weight_decay), kernel_initializer='he_normal')(layer0)
    layer0 = BatchNormalization()(layer0)
    layer0 = Activation('relu')(layer0)
    layer0 = Conv2D(filters=128, kernel_size=(3,3), strides=(2,2), padding='same', kernel_regularizer=regularizers.l2(weight_decay), kernel_initializer='he_normal')(layer0)
    layer0 = add([layer0, shortcut])
    layer0 = Activation('relu')(layer0)
    return layer0

input_shape = x_train.shape[1:]
input_img = Input(shape=input_shape)
x = conv1(input_img)
x = maxpool(x)
x = res1(x)
x = res1(x)
x = res1(x)
x = red1(x)
.
.
.
output = Dense(num_classes, activation='softmax')(x)

给定的信息非常稀少,但我的问题不是为什么我的架构不好?

您是否真的认为残差块已正确实施(尽管不是以我意识到的最有效的方式)?

我正在研究如何在一定时间内迭代它们,但我想知道是否有我误解的东西。

祝大家好运!

标签: pythonkerasconv-neural-networkresnet

解决方案


推荐阅读