как работает input_shape в keras.applications? - PullRequest
0 голосов
/ 20 февраля 2019

Я прошел через документацию Keras , но все еще не могу понять, как работает параметр input_shape и почему он не меняет количество параметров для моей модели DenseNet, когда я передаю егопользовательская форма ввода.Пример:

import keras
from keras import applications
from keras.layers import Conv3D, MaxPool3D, Flatten, Dense
from keras.layers import Dropout, Input, BatchNormalization
from keras import Model

# define model 1
INPUT_SHAPE = (224, 224, 1) # used to define the input size to the model
n_output_units = 2
activation_fn = 'sigmoid'
densenet_121_model = applications.densenet.DenseNet121(include_top=False, weights=None, input_shape=INPUT_SHAPE, pooling='avg')
inputs = Input(shape=INPUT_SHAPE, name='input')
model_base = densenet_121_model(inputs)
output = Dense(units=n_output_units, activation=activation_fn)(model_base)
model = Model(inputs=inputs, outputs=output)
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           (None, 224, 224, 1)       0         
_________________________________________________________________
densenet121 (Model)          (None, 1024)              7031232   
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 2050      
=================================================================
Total params: 7,033,282
Trainable params: 6,949,634
Non-trainable params: 83,648
_________________________________________________________________



# define model 2
INPUT_SHAPE = (512, 512, 1) # used to define the input size to the model
n_output_units = 2
activation_fn = 'sigmoid'
densenet_121_model = applications.densenet.DenseNet121(include_top=False, weights=None, input_shape=INPUT_SHAPE, pooling='avg')
inputs = Input(shape=INPUT_SHAPE, name='input')
model_base = densenet_121_model(inputs)
output = Dense(units=n_output_units, activation=activation_fn)(model_base)
model = Model(inputs=inputs, outputs=output)
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input (InputLayer)           (None, 512, 512, 1)       0         
_________________________________________________________________
densenet121 (Model)          (None, 1024)              7031232   
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 2050      
=================================================================
Total params: 7,033,282
Trainable params: 6,949,634
Non-trainable params: 83,648
_________________________________________________________________

В идеале при увеличении формы ввода число параметров должно увеличиваться, однако, как вы можете видеть, они остаются одинаковыми.Мои вопросы, таким образом:

  1. Почему число параметров не изменяется с изменением в input_shape?
  2. Я определил только один канал в моем input_shape, чтослучится с моей моделью обучения по этому сценарию?В документации сказано следующее:

input_shape: необязательный кортеж формы, указывается только в том случае, если include_top имеет значение False (в противном случае форма ввода должна быть (224, 224, 3) (с помощью 'channel_last (формат данных) или (3, 224, 224) (с форматом данных channel_first). Он должен иметь ровно 3 входных канала, а ширина и высота должны быть не менее 32. Например, (200, 200, 3)может быть одним допустимым значением.

Однако, когда я запускаю модель с этой конфигурацией, она запускается без каких-либо проблем. Может ли быть что-то, что мне не хватает?

Использование Keras 2.2.4с Tensorflow 1.12.0 в качестве бэкэнда.

1 Ответ

0 голосов
/ 20 февраля 2019

1.В сверточных слоях входной размер не влияет на количество весов, потому что количество весов определяется размерами матрицы ядра.Больший входной размер приводит к большему выходному размеру, но не к увеличению количества весов.

Это означает, что выходной размер сверточных слоев второй модели будет больше, чем для первой модели,который увеличит количество весов в следующем плотном слое.Однако если вы посмотрите на архитектуру DenseNet, то заметите, что после всех сверточных слоев есть слой GlobalMaxPooling2D, который усредняет все значения для каждого выходного канала.Вот почему выходные данные DenseNet будут иметь размер 1024 независимо от формы ввода.

2.Да, модель все еще будет работать.Я не совсем уверен в этом, но я предполагаю, что один канал будет транслироваться (дублироваться), чтобы заполнить все три канала.Это, по крайней мере, то, как эти вещи обычно обрабатываются (см., Например, TenSenflow или NUMPY ).

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