Каким образом Mobil eNet v1 достигает небольшого значения параметра в тензорном потоке? - PullRequest
0 голосов
/ 28 апреля 2020

Проблема

Я пытался пересобрать модель Mobil eNet, идентичную модели , предоставленной приложением keras, в Tensorflow v2.1.0.

Тем не менее, независимо от того, что я пытался (например, Conv2d, SeparableConv2D, DepthwiseConv2D), счетчик параметров, кажется, далек от того момента, когда модель начинает выделять в системе более 100 ГБ оперативной памяти.

Краткое описание модели версию keras и мою собственную версию вместе со слоями для моей версии можно найти ниже в разделе фрагментов.

Для простоты я не использую множитель ширины и разрешения (или, скажем, оба имеют значение 1.0).

Вопрос

Как можно достичь того же количества параметров, что и в версии, предоставленной керасом?

Фрагменты

Часть кераса мобил enet сводка модели

Model: "mobilenet_1.00_224"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
conv1_pad (ZeroPadding2D)    (None, 225, 225, 3)       0         
_________________________________________________________________
conv1 (Conv2D)               (None, 112, 112, 32)      864       
_________________________________________________________________
conv1_bn (BatchNormalization (None, 112, 112, 32)      128       
_________________________________________________________________
conv1_relu (ReLU)            (None, 112, 112, 32)      0         
_________________________________________________________________
conv_dw_1 (DepthwiseConv2D)  (None, 112, 112, 32)      288       
_________________________________________________________________
conv_dw_1_bn (BatchNormaliza (None, 112, 112, 32)      128       

Часть самостоятельно созданной сводки модели

Model: "dummy_model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
zero_padding2d (ZeroPadding2 (None, 225, 225, 3)       0         
_________________________________________________________________
conv2d (Conv2D)              (None, 112, 112, 32)      896       
_________________________________________________________________
batch_normalization (BatchNo (None, 112, 112, 32)      128       
_________________________________________________________________
re_lu (ReLU)                 (None, 112, 112, 32)      0         
_________________________________________________________________
depthwise_conv2d (DepthwiseC (None, 112, 112, 32)      32800     
_________________________________________________________________
batch_normalization_1 (Batch (None, 112, 112, 32)      128       

Самостоятельно созданная модель со слоями

inputs = Input(shape=(224, 224, 3))

x = ZeroPadding2D(padding=((1, 0), (1, 0)))(inputs)
x = Conv2D(32, (3, 3), strides=(2, 2), padding="valid")(x)
x = BatchNormalization()(x)
x = ReLU()(x)
x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x, 2)
x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x, 2)
x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x, 2)

x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x)
x = depthwise_separable_convolution(x)

x = depthwise_separable_convolution(x, 2)
x = depthwise_separable_convolution(x, 2)

x = AveragePooling2D(pool_size=7)(x)

x = Flatten()(x)
x = Dense(10, activation="softmax")(x)

return Model(inputs=inputs, outputs=x, name="dummy_model")

Глубоко разделяемая свертка

def depthwise_separable_convolution(self, input, strides=1):
    input_depth = input.shape[-1]
    output_depth = input_depth * 2

    x = DepthwiseConv2D(input_depth, 1, padding="same")(input)
    x = BatchNormalization()(x)
    x = ReLU()(x)
    x = Conv2D(output_depth, 1, padding="same")(x)
    x = BatchNormalization()(x)
    x = ReLU()(x)

    return x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...