Верна ли моя текущая реализация остаточных блоков? - PullRequest
0 голосов
/ 27 мая 2020

У меня к вам вопрос. Я написал сценарий остаточной сетевой архитектуры с использованием keras, но я не уверен, что мне удалось воспроизвести остаточные блоки.

Я хотел бы убедиться, что мой сценарий воспроизводит архитектуру. Мои навыки написания сценариев python не оптимальны, поэтому я попытался сделать остаточные блоки такими, как я их понял. Это громоздко, но просто. Я разделил их на 2 части (очень громоздко, так что ...); один, который является стандартным остаточным блоком, называется 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)

Данная информация очень скудная, но мой вопрос не в том, почему моя архитектура плохая?

Действительно ли вы считаете, что остаточные блоки были реализованы правильно (хотя и не в самый эффективный способ, который я понимаю)?

Я работаю над тем, как перебирать их определенное количество раз, но я хотел бы знать, есть ли что-то, что я неправильно понял.

С наилучшими пожеланиями!

...