python - 我当前对残差块的实现是否正确?
问题描述
我有一个问题要问你,我使用 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)
给定的信息非常稀少,但我的问题不是为什么我的架构不好?
您是否真的认为残差块已正确实施(尽管不是以我意识到的最有效的方式)?
我正在研究如何在一定时间内迭代它们,但我想知道是否有我误解的东西。
祝大家好运!
解决方案
推荐阅读
- botframework - Microsoft Bot Framework Composer - 无法从按钮触发 Intent
- shell - 将 Shell 脚本的存储过程异常返回给调用者
- jenkins - 优雅地停止詹金斯的工作
- typescript - TypeScript 将任何类型化数组转换为通用键值数组
- azure - Azure 分析服务部署通过
- r - 如何将函数应用于数据框中的所有列?
- c - _Generic 中的 C 条件表达式
- javascript - 反应测试:在测试中更改选择值
- ios - UIActivityViewController:如何从显示的活动中排除自己的共享扩展
- python - 用于启动 Visual Studio 并在其中运行 python 脚本的命令行语法