Как я могу использовать input_shape и input_tensor в Transfer Learning в Keras? - PullRequest
0 голосов
/ 05 июля 2019

Когда мы переносим обучение в Keras2., Аргументы требуют "input_shape" и "input_tensor".Но я использую только input_tensor и еще никогда не использовал input_shape.Я думаю, что достаточно только input_tensor, и я не знаю, когда использовать input_shape.Как мне использовать их отдельно?

Я использовал input_tensor и input_shape одновременно с отдельным значением, и было принято только значение input_tensor, а input_shape было проигнорировано.

vgg16_model = VGG16(include_top=False, weights='imagenet', 
                    input_tensor = Input(shape=(150, 150, 3)), 
                    input_shape=(224,224,3))

top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dense(1, activation='sigmoid'))
model = Model(input=vgg16_model.input, output=top_model(vgg16_model.output))

model.summary()
Layer (type)                 Output Shape              Param #   
================================================================
input_6 (InputLayer)         (None, 150, 150, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 150, 150, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 150, 150, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 75, 75, 64)        0         
_________________________________________________________________
block2_conv......

Я ожидал, что яполучить некоторые ошибки в этом коде, но ошибки не было, и эта модель может принять форму (150, 150, 3).Input_shape = (224,224,3) был проигнорирован.

Можете ли вы дать мне небольшую помощь?Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

На самом деле, когда вы устанавливаете аргумент input_tensor, данный тензор (при условии, что это тензор Кераса) будет использоваться для ввода, и поэтому аргумент input_shape будет игнорироваться. Здесь - соответствующий раздел в keras-applications исходном коде:

if input_tensor is None:
    img_input = layers.Input(shape=input_shape)
else:
    if not backend.is_keras_tensor(input_tensor):
        img_input = layers.Input(tensor=input_tensor, shape=input_shape)
    else:
        img_input = input_tensor

Как видите, в последней строке данное input_tensor будет использоваться для входного тензора без учета input_shape.

0 голосов
/ 05 июля 2019

Код VGG16, вероятно, просто забыл проверить два аргумента.

Нет смысла иметь оба, конечно.

  • Вы используете input_shape, когда хотите, чтобы модель автоматически создала свой собственный входной слой с таким размером.
  • Вы используете input_tensor, когда у вас есть тензор, который вы хотите использовать для ввода.

Вы можете использовать любой тензор в input_tensor, это означает использование выходов других моделей / слоев в качестве входа VGG16.Конечно, вы можете передать фиктивный входной тензор, как вы это сделали, для кода нет причин жаловаться, он получил тензор, хорошо.

Единственное, что кодер забыл проверить: «если оба аргумента существуют, выдается ошибка».

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