У меня к вам вопрос. Я написал сценарий остаточной сетевой архитектуры с использованием 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)
Данная информация очень скудная, но мой вопрос не в том, почему моя архитектура плохая?
Действительно ли вы считаете, что остаточные блоки были реализованы правильно (хотя и не в самый эффективный способ, который я понимаю)?
Я работаю над тем, как перебирать их определенное количество раз, но я хотел бы знать, есть ли что-то, что я неправильно понял.
С наилучшими пожеланиями!