keras.applications中的input_shape如何工作?

时间:2019-02-20 11:00:15

标签: python tensorflow keras

我经历过Keras documentation,但是我仍然无法弄清楚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)(   'channels_last'数据格式)或(3,224,224)(带有'channels_first'   数据格式)。它应该有3个输入通道,宽度和   高度应不小于32。 (200,200,3)将是一个   有效值。

但是,当我使用此配置运行模型时,它运行没有任何问题。可能有我遗漏的东西吗?

使用Keras 2.2.4和Tensorflow 1.12.0作为后端。

2 个答案:

答案 0 :(得分:1)

1。 在卷积层中,输入大小不影响权重的数量,因为权重的数量由内核矩阵维确定。较大的输入大小会导致较大的输出大小,但不会导致权重增加。

这意味着,第二个模型的卷积层的输出大小将大于第一个模型的卷积层,这将增加随后的密集层的权重数。但是,如果您看一下DenseNet的体系结构,则会注意到在所有卷积层之后有一个GlobalMaxPooling2D层,该层将每个输出通道的所有值取平均值。这就是为什么无论输入形状如何,DenseNet的输出大小都为1024的原因。

2。 是的,该模型仍然可以使用。我对此不太确定,但是我猜想单个频道将被广播(复制)以填充所有三个频道。至少这就是这些事情通常的处理方式(请参阅示例tensorflownumpy)。

答案 1 :(得分:0)

DenseNet由两部分组成:卷积部分和全局池化部分。

卷积部分可训练权重的数量不取决于输入形状。

通常,分类网络应采用完全连接的层来推断分类,但是,在DenseNet中使用global pooling,并且不会带来任何可训练的权重。

因此,输入形状不会影响整个网络的权数。